use std::{
fs, io,
path::PathBuf,
time::{SystemTime, UNIX_EPOCH},
};
use confique::Config;
use rust_config_tree::{
ConfigSchema,
config::{load_config, write_config_schemas},
transparent_array_section,
};
use schemars::JsonSchema;
transparent_array_section! {
pub struct ChildrenSection {
#[config(default = [{ "name": "worker" }])]
pub items: Vec<ChildDeclaration>,
}
}
#[derive(Debug, Clone, PartialEq, Config, JsonSchema, serde::Serialize, serde::Deserialize)]
pub struct ChildDeclaration {
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Config, JsonSchema, ConfigSchema)]
pub struct AppConfig {
#[config(default = [])]
pub include: Vec<PathBuf>,
#[config(default = "demo")]
pub mode: String,
#[config(nested)]
#[schemars(extend(
"x-tree-split" = true,
"x-tree-transparent-array" = true
))]
pub children: ChildrenSection,
}
fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let dir = temp_example_dir("transparent-array-section")?;
let root = dir.join("config.yaml");
let schema = dir.join("app.schema.json");
let children = dir.join("children.yaml");
fs::write(&root, "include:\n - children.yaml\nmode: demo\n")?;
fs::write(&children, "- name: api\n")?;
write_config_schemas::<AppConfig>(&schema)?;
println!("schema: {}", schema.display());
let config = load_config::<AppConfig>(&root)?;
println!("loaded children: {}", config.children.len());
assert_eq!(config.children.items[0].name, "api");
println!("split file: {}", children.display());
let _ = fs::remove_dir_all(dir);
Ok(())
}
fn temp_example_dir(name: &str) -> io::Result<PathBuf> {
let nanos = SystemTime::now()
.duration_since(UNIX_EPOCH)
.unwrap_or_default()
.as_nanos();
let dir = std::env::temp_dir().join(format!("rust-config-tree-{name}-{nanos}"));
fs::create_dir_all(&dir)?;
Ok(dir)
}