codama_syn_helpers/extensions/
fields.rs

1use super::ToTokensExtension;
2use codama_errors::CodamaResult;
3use syn::Fields;
4
5pub trait FieldsExtension {
6    fn get_self(&self) -> &Fields;
7
8    fn single_unnamed_field(&self) -> CodamaResult<&syn::Field> {
9        let this = self.get_self();
10        match this {
11            Fields::Unnamed(fields) if fields.unnamed.len() == 1 => Ok(&fields.unnamed[0]),
12            _ => Err(this
13                .error("expected a single unnamed field in the variant")
14                .into()),
15        }
16    }
17}
18
19impl FieldsExtension for Fields {
20    fn get_self(&self) -> &Fields {
21        self
22    }
23}
24
25#[cfg(test)]
26mod tests {
27    use super::*;
28
29    #[test]
30    fn single_unnamed_field_ok() {
31        let r#struct: syn::ItemStruct = syn::parse_quote! { struct Foo(u32); };
32        assert!(r#struct.fields.single_unnamed_field().is_ok());
33    }
34
35    #[test]
36    fn single_unnamed_field_err() {
37        let r#struct: syn::ItemStruct = syn::parse_quote! { struct Foo(u32, u64); };
38        assert!(r#struct.fields.single_unnamed_field().is_err());
39    }
40}