use horon::{Horon, HoronConfig, HoronResult};
use g_math::fixed_point::FixedPoint;
fn coords(total_dims: usize, user_vals: &[f64]) -> Vec<u8> {
let mut out = vec![0u8; total_dims * 16];
for (i, v) in user_vals.iter().enumerate() {
let off = (16 + i) * 16;
out[off..off + 16].copy_from_slice(&FixedPoint::from_f64(*v).raw().to_le_bytes());
}
out
}
fn main() -> HoronResult<()> {
let path = std::env::temp_dir().join("lifecycle_demo.htt");
let _ = std::fs::remove_file(&path);
let dims = 18u8;
{
let htt = Horon::open_with_config(&path, HoronConfig {
semantic_dims: dims,
..Default::default()
})?;
htt.put("/fleet/eu/web-01", b"nginx 1.27")?;
htt.put("/fleet/eu/web-02", b"nginx 1.27")?;
htt.put("/fleet/eu/batch-01", b"cron runner")?;
htt.set_meta("/fleet/eu/web-01", "role", "edge")?;
htt.set_semantic("/fleet/eu/web-01", coords(dims as usize, &[0.80, 0.70]))?;
htt.set_semantic("/fleet/eu/web-02", coords(dims as usize, &[0.75, 0.65]))?;
htt.set_semantic("/fleet/eu/batch-01", coords(dims as usize, &[0.20, 0.05]))?;
let data = htt.get("/fleet/eu/web-01")?;
let machines = htt.children("/fleet/eu")?;
let similar = htt.neighbors_semantic("/fleet/eu/web-01", 2, 16..dims as usize)?;
println!("payload: {}", String::from_utf8_lossy(&data));
println!("machines: {:?}", machines);
println!("similar: {:?}", similar);
htt.put("/fleet/eu/web-01", b"nginx 1.28")?; htt.set_meta("/fleet/eu/web-01", "role", "edge-canary")?;
htt.set_semantic("/fleet/eu/web-01", coords(dims as usize, &[0.55, 0.60]))?;
htt.remove("/fleet/eu/batch-01")?; htt.compact()?; }
let htt = Horon::open(&path)?;
assert_eq!(htt.get("/fleet/eu/web-01")?, b"nginx 1.28");
assert_eq!(
htt.get_meta("/fleet/eu/web-01")?.get("role").map(String::as_str),
Some("edge-canary")
);
assert!(!htt.exists("/fleet/eu/batch-01"));
println!("reopened: {} nodes, state intact", htt.len());
let _ = std::fs::remove_file(&path);
Ok(())
}