use sml::{parse_file, to_sml};
use std::fs;
fn main() {
let dir = std::env::temp_dir().join("sml_include_demo");
let _ = fs::remove_dir_all(&dir);
fs::create_dir_all(dir.join("conf.d")).expect("create demo dir");
fs::write(
dir.join("conf.d/common.sml"),
"region: cn-north-1\nretry: 3\n",
)
.unwrap();
fs::write(dir.join("conf.d/db.sml"), "include \"common.sml\"\nhost: db.internal\nport: 5432\n").unwrap();
fs::write(
dir.join("app.sml"),
"app: resender\n\n\
database {\n\
\x20 include \"conf.d/db.sml\"\n\
\x20 pool: 16\n\
}\n\n\
cache {\n\
\x20 include \"conf.d/common.sml\"\n\
\x20 ttl: 300\n\
}\n",
)
.unwrap();
let path = dir.join("app.sml");
println!("--- app.sml ---");
println!("{}", fs::read_to_string(&path).unwrap());
let value = match parse_file(&path) {
Ok(v) => v,
Err(e) => {
eprintln!("parse error: {e}");
std::process::exit(1);
}
};
println!("--- resolved ---");
println!("{}", to_sml(&value));
println!("--- query ---");
println!("app = {:?}", value.get("app").and_then(|v| v.as_str()));
println!("db.host = {:?}", value.get("database.host").and_then(|v| v.as_str()));
println!("db.port = {:?}", value.get("database.port"));
println!("db.region= {:?}", value.get("database.region").and_then(|v| v.as_str()));
println!("cache.ttl= {:?}", value.get("cache.ttl"));
assert_eq!(
value.get("database.region").and_then(|v| v.as_str()),
Some("cn-north-1")
);
assert_eq!(
value.get("cache.region").and_then(|v| v.as_str()),
Some("cn-north-1"),
"common.sml 应能被多处引用"
);
#[cfg(feature = "serde")]
{
println!("--- json (serde) ---");
println!("{}", serde_json::to_string_pretty(&value).unwrap());
}
let _ = fs::remove_dir_all(&dir);
}