use darling::{FromDeriveInput, FromMeta};
use syn::parse_str;
#[derive(Debug, FromDeriveInput)]
#[darling(attributes(my_trait), and_then = "MyInputReceiver::autocorrect")]
pub struct MyInputReceiver {
#[darling(map = "MyInputReceiver::make_string_shouty")]
name: String,
frequency: darling::Result<i64>,
amplitude: Result<u64, syn::Meta>,
}
impl MyInputReceiver {
fn make_string_shouty(s: String) -> String {
s.to_uppercase()
}
fn autocorrect(self) -> darling::Result<Self> {
let Self {
name,
frequency,
amplitude,
} = self;
let amplitude = match amplitude {
Ok(amp) => amp,
Err(mi) => (i64::from_meta(&mi)?).abs() as u64,
};
Ok(Self {
name,
frequency,
amplitude: Ok(amplitude),
})
}
}
fn main() {
let input = r#"#[derive(MyTrait)]
#[my_trait(name="Jon", amplitude = "-1", frequency = 1)]
pub struct Foo;"#;
let parsed = parse_str(input).unwrap();
let receiver = MyInputReceiver::from_derive_input(&parsed).unwrap();
println!(
r#"
INPUT:
{}
PARSED AS:
{:?}
"#,
input, receiver
);
}