atagen

jelq

public

an http based roguelike rpg about jelqing

Star0
Watch0
e028a4184d000c9c7b61f60e056db01c53aeea23
1
ssh://brewery@pls.lobotomise.me:33/atagen/jelq.git
src/config.rsRust58 lines1.8 KB
1
use std::{path::PathBuf, time::Duration};
2
3
use crate::game::oracle::OracleTemplate;
4
use crate::secret::Secret;
5
6
pub struct Config {
7
    pub addr: String,
8
    pub secret: Secret,
9
    pub max_runs: usize,
10
    pub idle_ttl: Duration,
11
    /// Where finished runs are kept. `None` keeps them in memory, which only tests want.
12
    pub db: Option<PathBuf>,
13
    pub(crate) oracle: OracleTemplate,
14
}
15
16
impl Default for Config {
17
    fn default() -> Self {
18
        Self {
19
            addr: "127.0.0.1:6969".into(),
20
            secret: Secret::random(),
21
            max_runs: 10_000,
22
            idle_ttl: Duration::from_secs(6 * 60 * 60),
23
            db: None,
24
            oracle: OracleTemplate::Rng,
25
        }
26
    }
27
}
28
29
/// The XDG state directory, so `nix run` from anywhere finds the same graveyard.
30
fn default_db() -> PathBuf {
31
    let state = std::env::var_os("XDG_STATE_HOME")
32
        .map(PathBuf::from)
33
        .or_else(|| std::env::var_os("HOME").map(|home| PathBuf::from(home).join(".local/state")));
34
    match state {
35
        Some(dir) => dir.join("jelqd").join("jelqd.sqlite"),
36
        None => PathBuf::from("jelqd.sqlite"),
37
    }
38
}
39
40
impl Config {
41
    pub fn from_env() -> Self {
42
        let var = |name| std::env::var(name).ok();
43
        let defaults = Self::default();
44
        Self {
45
            addr: var("JELQD_ADDR").unwrap_or(defaults.addr),
46
            db: Some(var("JELQD_DB").map_or_else(default_db, PathBuf::from)),
47
            secret: var("JELQD_SECRET").map_or(defaults.secret, |s| Secret::new(s.into_bytes())),
48
            oracle: match var("JELQD_ORACLE").as_deref() {
49
                Some("clm") => OracleTemplate::Clm {
50
                    url: var("JELQD_CLM_URL")
51
                        .unwrap_or_else(|| "http://127.0.0.1:8700/v1/systemone".into()),
52
                },
53
                _ => defaults.oracle,
54
            },
55
            ..defaults
56
        }
57
    }
58
}