use lino_objects_codec::{decode_line, encode_line, LinoValue};
use std::fmt::Write as _;
fn record(phase: &str, bytes: i64, complete: bool) -> LinoValue {
LinoValue::object([
("phase", LinoValue::String(phase.to_string())),
("bytes", LinoValue::Int(bytes)),
("complete", LinoValue::Bool(complete)),
])
}
fn main() {
println!("=== Append-only log, one record per line ===\n");
let mut log = String::new();
for entry in [
record("stream_start", 0, false),
record("stream_chunk", 1024, false),
record("stream_end", 2827, true),
] {
writeln!(log, "{}", encode_line(&entry)).expect("writing to a string cannot fail");
}
print!("{log}");
println!("\nrecords: {}", log.lines().count());
let last = log.lines().next_back().expect("the log holds records");
let decoded = decode_line(last).expect("a line written by encode_line reads back");
println!("last record: {decoded:?}");
assert_eq!(decoded, record("stream_end", 2827, true));
let finished = log
.lines()
.filter(|line| line.contains("(complete true)"))
.count();
println!("finished records: {finished}");
}