use galata_vault::{Error, NewConfig, Vault};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let vault = Vault::from_env()?;
let written = match vault.config("app") {
Ok(doc) => {
let mut table: toml::Table = doc.deserialize()?;
let revision = table
.get("revision")
.and_then(toml::Value::as_integer)
.unwrap_or(0);
table.insert("revision".into(), toml::Value::Integer(revision + 1));
let edit = NewConfig::toml(toml::to_string(&table)?).expect_version(doc.version());
vault.set_config("app", edit)
}
Err(e) if e.code() == galata_vault::code::NOT_FOUND => {
vault.set_config("app", NewConfig::toml("revision = 1\n"))
}
Err(e) => return Err(e.into()),
};
match written {
Ok(version) => println!("app is now at version {version}"),
Err(Error::Conflict {
expected, current, ..
}) => {
println!(
"someone else wrote app first (expected {expected:?}, now {current:?}); nothing was overwritten"
)
}
Err(e) => return Err(e.into()),
}
Ok(())
}