nix_compat_derive/internal/
inputs.rs1#[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 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}