nix_compat_derive/internal/
inputs.rs

1#[derive(Debug, Clone, PartialEq, Eq)]
2pub struct RemoteInput {
3    pub attrs: Vec<syn::Attribute>,
4    pub ident: syn::Type,
5}
6
7impl syn::parse::Parse for RemoteInput {
8    fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> {
9        let attrs = input.call(syn::Attribute::parse_outer)?;
10
11        let ident = input.parse::<syn::Type>()?;
12        Ok(RemoteInput { attrs, ident })
13    }
14}
15
16impl quote::ToTokens for RemoteInput {
17    fn to_tokens(&self, tokens: &mut proc_macro2::TokenStream) {
18        fn is_outer(attr: &&syn::Attribute) -> bool {
19            match attr.style {
20                syn::AttrStyle::Outer => true,
21                syn::AttrStyle::Inner(_) => false,
22            }
23        }
24        for attr in self.attrs.iter().filter(is_outer) {
25            attr.to_tokens(tokens);
26        }
27        self.ident.to_tokens(tokens);
28    }
29}
30
31#[cfg(test)]
32mod test {
33    use syn::parse_quote;
34    //use syn::parse::Parse;
35
36    use super::*;
37
38    #[test]
39    fn test_input() {
40        let p: RemoteInput = parse_quote!(u64);
41        assert_eq!(
42            p,
43            RemoteInput {
44                attrs: vec![],
45                ident: parse_quote!(u64),
46            }
47        );
48    }
49
50    #[test]
51    fn test_input_attr() {
52        let p: RemoteInput = parse_quote!(
53            #[nix]
54            u64
55        );
56        assert_eq!(
57            p,
58            RemoteInput {
59                attrs: vec![parse_quote!(#[nix])],
60                ident: parse_quote!(u64),
61            }
62        );
63    }
64
65    #[test]
66    fn test_input_attr_multiple() {
67        let p: RemoteInput = parse_quote!(
68            #[nix]
69            #[hello]
70            u64
71        );
72        assert_eq!(
73            p,
74            RemoteInput {
75                attrs: vec![parse_quote!(#[nix]), parse_quote!(#[hello])],
76                ident: parse_quote!(u64),
77            }
78        );
79    }
80
81    #[test]
82    fn test_input_attr_full() {
83        let p: RemoteInput = parse_quote!(
84            #[nix(try_from = "u64")]
85            usize
86        );
87        assert_eq!(
88            p,
89            RemoteInput {
90                attrs: vec![parse_quote!(#[nix(try_from="u64")])],
91                ident: parse_quote!(usize),
92            }
93        );
94    }
95
96    #[test]
97    fn test_input_attr_other() {
98        let p: RemoteInput = parse_quote!(
99            #[muh]
100            u64
101        );
102        assert_eq!(
103            p,
104            RemoteInput {
105                attrs: vec![parse_quote!(#[muh])],
106                ident: parse_quote!(u64),
107            }
108        );
109    }
110}