qm_redis/
config.rs

1use serde::Deserialize;
2use std::sync::Arc;
3
4#[derive(Deserialize)]
5pub struct Config {
6    host: Option<Arc<str>>,
7    port: Option<u16>,
8    #[serde(skip)]
9    address: Option<Arc<str>>,
10}
11
12impl Config {
13    pub fn new() -> envy::Result<Self> {
14        ConfigBuilder::default().build()
15    }
16
17    pub fn builder<'a>() -> ConfigBuilder<'a> {
18        ConfigBuilder::default()
19    }
20
21    pub fn address(&self) -> &str {
22        self.address.as_deref().unwrap()
23    }
24}
25
26#[derive(Default)]
27pub struct ConfigBuilder<'a> {
28    prefix: Option<&'a str>,
29}
30
31impl<'a> ConfigBuilder<'a> {
32    pub fn with_prefix(mut self, prefix: &'a str) -> Self {
33        self.prefix = Some(prefix);
34        self
35    }
36
37    pub fn build(self) -> envy::Result<Config> {
38        let mut cfg: Config = if let Some(prefix) = self.prefix {
39            envy::prefixed(prefix)
40        } else {
41            envy::prefixed("REDIS_")
42        }
43        .from_env()?;
44
45        let host = cfg.host.as_deref().unwrap_or("127.0.0.1");
46        let port = cfg.port.unwrap_or(6379);
47        cfg.address = Some(Arc::from(format!("redis://{}:{}/", host, port)));
48        Ok(cfg)
49    }
50}
51
52#[cfg(test)]
53mod tests {
54    #[test]
55    fn parse_builtin_config_test() -> envy::Result<()> {
56        let cfg = super::Config::builder()
57            .with_prefix("DEFAULT_REDIS_NOT_SET_IN_SHELL_")
58            .build()?;
59        assert_eq!(cfg.address(), "redis://127.0.0.1:6379/");
60        Ok(())
61    }
62
63    #[test]
64    fn parse_default_config_test() -> envy::Result<()> {
65        std::env::set_var("REDIS_HOST", "localhost");
66        std::env::set_var("REDIS_PORT", "6379");
67        let cfg = super::Config::new()?;
68        assert_eq!(cfg.address(), "redis://localhost:6379/");
69        Ok(())
70    }
71
72    #[test]
73    fn parse_prefixed_config_test() -> envy::Result<()> {
74        std::env::set_var("REDIS_CACHE_HOST", "localhost");
75        std::env::set_var("REDIS_CACHE_PORT", "6379");
76        let cfg = super::Config::builder()
77            .with_prefix("REDIS_CACHE_")
78            .build()?;
79        assert_eq!(cfg.address(), "redis://localhost:6379/");
80        Ok(())
81    }
82}