use std::path::Path;
use one_brackets::{Counted, Node, Rest};
use serde::{Deserialize, Serialize};
const SAMPLE: &str = include_str!("1cv8wsrv.lst");
#[derive(Debug, Deserialize, Serialize)]
struct Registry {
clusters: Counted<Cluster>,
admins: Counted<Node>,
#[serde(default)]
rest: Rest,
}
#[derive(Debug, Deserialize, Serialize)]
struct Cluster {
#[serde(with = "one_brackets::atom")]
id: String,
name: String,
port: u16,
host: String,
#[serde(default)]
rest: Rest,
}
fn main() -> Result<(), Box<dyn std::error::Error>> {
let node: Node = match std::env::args_os().nth(1) {
Some(path) => Node::try_from(Path::new(&path))?,
None => SAMPLE.parse()?,
};
let registry: Registry = one_brackets::from_node(&node)?;
for cluster in ®istry.clusters {
println!(
"{:?} on {}:{} (id {}, {} more settings)",
cluster.name,
cluster.host,
cluster.port,
cluster.id,
cluster.rest.len()
);
}
println!("central server administrators: {}", registry.admins.len());
assert_eq!(one_brackets::to_node(®istry)?, node);
println!("round trip: ok");
Ok(())
}