vine_core/config/
mod.rs

1mod property_resolver;
2
3use std::path::Path;
4use std::sync::Arc;
5use config::{Config, Environment, File};
6use crate::context::context::Context;
7use crate::core::bean_def::BeanDef;
8use crate::core::Error;
9use crate::core::ty::Type;
10
11pub use property_resolver::PropertyResolver as PropertyResolver;
12
13pub fn get_config_context() -> Result<Context, Error> {
14    let config_context = Context::new("config");
15
16    let ty = Type::of::<Config>();
17    ty.add_downcast::<Config>(|b| Ok(Arc::downcast::<Config>(b)?));
18    ty.add_downcast::<dyn PropertyResolver + Send + Sync>(|b| Ok(Arc::downcast::<Config>(b)?));
19
20    let mut config_builder = Config::builder();
21
22    if Path::new("app.yaml").exists() {
23        config_builder = config_builder.add_source(File::with_name("app.yaml"))
24    }
25    config_builder = config_builder.add_source(Environment::with_prefix("-D"));
26
27    let config = Arc::new(config_builder.build().unwrap());
28    config_context.register(BeanDef::builder()
29        .name("config")
30        .ty(ty)
31        .get(Arc::new(move |_| { Ok(config.clone()) }))
32        .build())?;
33
34    Ok(config_context)
35}