1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Default, Serialize, Deserialize)]
4pub struct LogConfig {
5 #[serde(default = "default_log_level")]
6 pub level: String,
7 #[serde(default = "default_log_to_console")]
8 pub console: bool,
9 #[serde(default)]
10 pub file: bool,
11}
12
13fn default_log_level() -> String {
14 "info".into()
15}
16
17fn default_log_to_console() -> bool {
18 true
19}
20
21#[cfg(feature = "web")]
22#[derive(Debug, Clone, Default, Serialize, Deserialize)]
23pub struct WebConfig {
24 #[serde(default = "default_web_bind")]
25 pub bind: String,
26}
27#[cfg(feature = "web")]
28fn default_web_bind() -> String {
29 "0.0.0.0:10000".into()
30}
31
32#[cfg(feature = "database")]
33#[derive(Debug, Clone, Default, Serialize, Deserialize)]
34pub struct DatabaseConfig {
35 #[serde(default)]
36 pub url: String,
37 #[serde(default = "default_database_max_conn")]
38 pub max_conn: u32,
39 #[serde(default)]
40 pub show_sql: bool,
41}
42
43#[cfg(feature = "database")]
44fn default_database_max_conn() -> u32 {
45 num_cpus::get() as u32
46}
47
48#[cfg(feature = "redis")]
49#[derive(Debug, Clone, Default, Serialize, Deserialize)]
50pub struct RedisConfig {
51 #[serde(default)]
53 pub url: String,
54}
55
56#[cfg(feature = "mongo")]
57#[derive(Debug, Clone, Default, Serialize, Deserialize)]
58pub struct MongoConfig {
59 #[serde(default)]
61 pub url: String,
62}
63
64#[cfg(feature = "influx")]
65#[derive(Debug, Clone, Default, Serialize, Deserialize)]
66pub struct InfluxConfig {
67 #[serde(default)]
68 pub url: String,
69 #[serde(default)]
70 pub org: String,
71 #[serde(default)]
72 pub token: String,
73}
74
75#[cfg(feature = "config")]
76pub fn init<'de, T: Deserialize<'de>>(config_name: &str) -> anyhow::Result<T> {
77 let settings = config::Config::builder()
78 .add_source(config::File::with_name(config_name).required(false))
79 .add_source(config::Environment::with_prefix("app").try_parsing(true).separator("__"))
80 .build()?;
81 let config: T = settings.try_deserialize()?;
82 Ok(config)
83}