use structio::{KeyMap, Keys, Options, beve, json};
struct Walked<'a>(&'a [(String, Option<u32>)]);
impl Keys for Walked<'_> {
const KEYS: &'static [&'static str] = &[];
const MAP: &'static KeyMap = &KeyMap::build(Self::KEYS);
}
impl json::WriteObject for Walked<'_> {
fn write_fields<O: Options>(&self, w: &mut json::Writer<'_, O>) {
for (key, value) in self.0 {
w.member_key(key, value);
}
}
}
impl beve::WriteObject for Walked<'_> {
fn write_fields<O: Options>(&self, w: &mut beve::Writer<'_, O>) {
for (key, value) in self.0 {
w.member_key(key, value);
}
}
fn count_fields<O: Options>(&self) -> usize {
if O::SKIP_NULL {
self.0.iter().filter(|(_, v)| v.is_some()).count()
} else {
self.0.len()
}
}
}
impl json::Write for Walked<'_> {
fn write<O: Options>(&self, w: &mut json::Writer<'_, O>) {
w.write_object(self);
}
}
impl beve::Write for Walked<'_> {
fn write<O: Options>(&self, w: &mut beve::Writer<'_, O>) {
w.write_object(self);
}
}
fn main() {
let walked = Walked(&[
("say \"hi\"".to_owned(), Some(1)),
("absent".to_owned(), None),
]);
assert_eq!(
structio::to_string(&walked),
r#"{"say \"hi\"":1,"absent":null}"#
);
assert_eq!(
structio::to_string_with::<structio::SkipNull, _>(&walked),
r#"{"say \"hi\"":1}"#
);
assert!(!structio::to_beve_with::<structio::SkipNull, _>(&walked).is_empty());
}