use sickle::load;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let ccl = r#"
/= Application configuration
name = Santa Package Manager
version = 0.1.0
author = Tyler Butler
/= Database settings
database =
host = localhost
port = 5432
credentials =
username = admin
password = secret
/= Feature flags
features =
= hot-reload
= script-generation
= multi-platform
"#;
println!("Parsing CCL document...\n");
let model = load(ccl)?;
println!("Application Info:");
println!(" Name: {}", model.get_string("name")?);
println!(" Version: {}", model.get_string("version")?);
println!(" Author: {}", model.get_string("author")?);
println!("\nDatabase Configuration:");
let db = model.get("database")?;
for (key, value) in db.iter() {
if value.len() == 1 && value.values().next().unwrap().is_empty() {
let s = value.keys().next().unwrap();
println!(" {}: {}", key, s);
} else {
println!(" {}:", key);
for (k, v) in value.iter() {
if v.len() == 1 && v.values().next().unwrap().is_empty() {
let s = v.keys().next().unwrap();
println!(" {}: {}", k, s);
}
}
}
}
println!("\nUsing nested access:");
let username = model
.get("database")?
.get("credentials")?
.get_string("username")?;
println!(" DB Username: {}", username);
println!("\nParsed typed values:");
let port = model.get("database")?.get_int("port")?;
println!(" Port (as i64): {}", port);
Ok(())
}