use genies_derive::ConfigCore;
use serde::{Deserialize, Serialize};
#[derive(ConfigCore, Debug, Deserialize, Serialize)]
pub struct BasicConfig {
#[config(default = "localhost")]
pub host: String,
#[config(default = 8080)]
#[config(validate(range(min = 1, max = 65535)))]
pub port: u16,
pub app_name: String,
}
#[derive(ConfigCore, Debug, Deserialize, Serialize)]
pub struct ArrayConfig {
#[config(default = "topic1,topic2,topic3")]
pub topics: Vec<String>,
#[config(default = "1,2,3")]
pub numbers: Vec<i32>,
#[config(default = "")]
pub empty_array: Vec<String>,
}
#[derive(ConfigCore, Debug, Deserialize, Serialize)]
pub struct OptionalConfig {
#[config(default = "guest")]
pub username: Option<String>,
pub password: Option<String>,
#[config(default = "3600")]
#[config(validate(range(min = 60, max = 86400)))]
pub timeout_seconds: Option<u64>,
}
#[derive(ConfigCore, Debug, Deserialize, Serialize)]
pub struct ComplexConfig {
#[config(default = "my-app")]
pub app_name: String,
#[config(default = "development")]
pub environment: String,
pub allowed_hosts: Option<Vec<String>>,
#[config(default = "8080,8081,8082")]
#[config(validate(range(min = 1, max = 65535)))]
pub ports: Vec<u16>,
#[config(default = "30")]
pub connection_timeout: Option<u64>,
#[config(default = "300")]
pub read_timeout: Option<u64>,
}
#[derive(ConfigCore, Debug, Deserialize, Serialize)]
pub struct EnvArrayConfig {
#[config(default = "default1,default2")]
pub topics: Vec<String>,
#[config(default = "1,2,3")]
pub numbers: Vec<i32>,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("cwd: {:?}", std::env::current_dir()?);
let basic_config_path = "crates/config/examples/config/basic.yml";
println!("Attempting to read basic config from path: {}", basic_config_path);
let basic_config = BasicConfig::from_sources(basic_config_path)?;
println!("Basic Config: {:?}", basic_config);
let array_config_path = "crates/config/examples/config/array.yml";
println!("Attempting to read array config from path: {}", array_config_path);
let array_config = ArrayConfig::from_sources(array_config_path)?;
println!("Array Config: {:?}", array_config);
let optional_config_path = "crates/config/examples/config/optional.yml";
println!("Attempting to read optional config from path: {}", optional_config_path);
let optional_config = OptionalConfig::from_sources(optional_config_path)?;
println!("Optional Config: {:?}", optional_config);
let complex_config_path = "crates/config/examples/config/complex.yml";
println!("Attempting to read complex config from path: {}", complex_config_path);
let complex_config = ComplexConfig::from_sources(complex_config_path)?;
println!("Complex Config: {:?}", complex_config);
let env_array_config_path = "crates/config/examples/config/array.yml";
println!("Attempting to read env array config from path: {}", env_array_config_path);
let env_array_config = EnvArrayConfig::from_sources(env_array_config_path)?;
println!("EnvArrayConfig (from env): {:?}", env_array_config);
Ok(())
}