Skip to main content

starfish_sdk/
config.rs

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	/// redis://[<username>][:<password>@]<hostname>[:port][/<db>]
52	#[serde(default)]
53	pub url: String,
54}
55
56#[cfg(feature = "mongo")]
57#[derive(Debug, Clone, Default, Serialize, Deserialize)]
58pub struct MongoConfig {
59	/// mongodb://user:pass@localhost:27017
60	#[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}