mod utils;
use {
anstream::{print, println},
compris::{annotate::*, normal::*, parse::*, resolve::*, *},
depiction::*,
std::{collections::*, fmt},
};
#[derive(Depict, Default, Resolve)]
#[resolve(annotated_parameter=AnnotatedT)]
#[allow(dead_code)]
struct User<AnnotatedT, ExtraT>
where
AnnotatedT: fmt::Debug,
ExtraT: Default + fmt::Debug,
{
#[resolve(required)]
#[depict(as(display), style(string))]
name: String,
#[resolve]
#[depict(as(display), style(number), tag(tag::span))]
credit: Annotate<i32, AnnotatedT>,
#[resolve(required, key = "enabled")]
#[depict(style(symbol))]
is_enabled: bool,
#[resolve(null = Some("NO GROUP".into()))]
#[depict(option, as(display), style(string))]
group: Option<String>,
#[resolve]
#[depict(option, as(depict))]
metadata: Option<Variant<AnnotatedT>>,
#[resolve(other_keys, null = -100)]
#[depict(iter(kv), key_style(string), key_as(display), style(number))]
other: HashMap<String, i64>,
#[depict(skip)]
extra: ExtraT,
#[resolve(annotations)]
#[depict(skip)]
annotations: StructAnnotations,
}
pub fn main() {
let json = r#"[{
"name": "Tal",
"credit": "wrong type",
"group": null,
"metadata": {"anything": "we want"}
}, {
"name": "Shiri",
"credit": 123,
"enabled": true,
"mystery key 1!": 456,
"mystery key 2!": null
}]"#;
let variant = with_annotations!(
Parser::new(Format::JSON).with_source("json".into()).with_try_integers(true).parse_string(json).expect("parse")
);
let mut errors = ResolveErrors::default();
let users: Vec<User<_, isize>> =
variant.resolve_with_errors(&mut errors).expect("errors should be accumulated").expect("some");
utils::heading("partially resolved", true);
for user in &users {
user.print_default_depiction();
}
if !errors.is_empty() {
println!();
errors.annotated_depictions(Some("accumulated errors".into())).print_default_depiction();
}
utils::heading("annotations", false);
for (index, user) in users.iter().enumerate() {
println!("User[{}]: ", index);
let annotations: BTreeMap<_, _> = user.annotations.iter().collect();
for (field_name, annotation) in annotations {
print!(" ");
if !field_name.is_empty() {
print!("{}: ", field_name);
}
annotation.print_default_depiction();
}
}
}