cfg_rs/
derive.rs

1use crate::FromConfig;
2
3/// Config with prefix. This trait is auto derived by [FromConfig](./derive.FromConfig.html#struct-annotation-attribute).
4pub trait FromConfigWithPrefix: FromConfig {
5    /// Predefined key of config, so you don't have to provide it.
6    fn prefix() -> &'static str;
7}
8
9#[cfg_attr(coverage_nightly, coverage(off))]
10#[cfg(test)]
11mod test {
12    use crate::{source::memory::HashSource, test::TestConfigExt, *};
13    #[derive(FromConfig, Debug, PartialEq, Eq)]
14    #[config(prefix = "app", crate = "crate")]
15    pub(crate) struct ConfigObject {
16        hello: String,
17        option: Option<String>,
18        list: Vec<String>,
19        count: u8,
20        #[config(name = "count")]
21        count_rename: u8,
22        #[config(default = 3)]
23        def: u8,
24    }
25
26    #[test]
27    fn derive_test() {
28        let config = HashSource::new("test")
29            .set("app.hello", "world")
30            .set("app.count", "1")
31            .set("app.count_rename", "2")
32            .new_config();
33        let object: ConfigObject = config.get("app").unwrap();
34        assert_eq!("world", object.hello);
35        assert_eq!(None, object.option);
36        let v: Vec<String> = vec![];
37        assert_eq!(v, object.list);
38        assert_eq!(1, object.count);
39        assert_eq!(1, object.count_rename);
40        assert_eq!(3, object.def);
41        let object2: ConfigObject = config.get_predefined().unwrap();
42        assert_eq!(object, object2);
43    }
44}