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}