File size: 1,720 Bytes
e4dfce5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
use rocket::{get, launch, routes};
use rocket::State;
use std::env;
use std::fs::File;
use std::io::Read;
use std::sync::{Arc, Mutex};

struct Counter {
    value: i32,
    username: String,
}

#[get("/")]
fn index(counter: &State<Arc<Mutex<Counter>>>) -> String {
    let counter_lock = counter.lock().unwrap();
    format!("Hi {}!\nCounter: {}", counter_lock.username, counter_lock.value)
}

#[get("/add")]
fn increment(counter: &State<Arc<Mutex<Counter>>>) -> String {
    let mut counter_lock = counter.lock().unwrap();
    counter_lock.value += 1;
    format!("Hi {}!\nIncremented!\nNew value: {}", counter_lock.username, counter_lock.value)
}

#[get("/reset")]
fn reset(counter: &State<Arc<Mutex<Counter>>>) -> String {
    let mut counter_lock = counter.lock().unwrap();
    counter_lock.value = 0;
    format!("Hi {}!\nReset Success!\nCounter: {}", counter_lock.username, counter_lock.value)
}

#[launch]
fn rocket() -> _ {
    let config_path: String = match env::var("CONFIG_PATH") {
        Ok(val) => val,
        Err(_) => "config.yaml".to_string(),
    };
    println!("Using config file: {config_path}");

    let mut f: File = std::fs::File::open(config_path).expect("Can't open config.yaml");

    let mut str: String = String::new();
    f.read_to_string(&mut str).expect("Can't read config.yaml");

    let data: serde_yaml::Value = serde_yaml::from_str(&str).expect("Can't parse config.yaml");
    let username: String = data["username"]
        .as_str()
        .map(|s| s.to_string())
        .expect("Can't find username in config.yaml");

    rocket::build()
        .manage(Arc::new(Mutex::new(Counter { value: 0, username: username })))
        .mount("/", routes![index, increment, reset])
}