summaryrefslogtreecommitdiffstats
path: root/third_party/rust/darling/examples/supports_struct.rs
blob: 97a5bb9c055e0d789c2506d1d00889d98f901a69 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// The use of fields in debug print commands does not count as "used",
// which causes the fields to trigger an unwanted dead code warning.
#![allow(dead_code)]

use darling::{ast, util, FromDeriveInput, FromField};
use syn::{Ident, Type};

#[derive(Debug, FromField)]
#[darling(attributes(lorem))]
pub struct LoremField {
    ident: Option<Ident>,
    ty: Type,
    #[darling(default)]
    skip: bool,
}

#[derive(Debug, FromDeriveInput)]
#[darling(attributes(lorem), supports(struct_named))]
pub struct Lorem {
    ident: Ident,
    data: ast::Data<util::Ignored, LoremField>,
}

fn main() {
    let good_input = r#"#[derive(Lorem)]
pub struct Foo {
    #[lorem(skip)]
    bar: bool,

    baz: i64,
}"#;

    let bad_input = r#"#[derive(Lorem)]
    pub struct BadFoo(String, u32);"#;

    let parsed = syn::parse_str(good_input).unwrap();
    let receiver = Lorem::from_derive_input(&parsed).unwrap();
    let wrong_shape_parsed = syn::parse_str(bad_input).unwrap();
    let wrong_shape = Lorem::from_derive_input(&wrong_shape_parsed).expect_err("Shape was wrong");

    println!(
        r#"
INPUT:

{}

PARSED AS:

{:?}

BAD INPUT:

{}

PRODUCED ERROR:

{}
    "#,
        good_input, receiver, bad_input, wrong_shape
    );
}