trident_syn/parser/
trident_fuzz_test_methods.rs

1use syn::parse::Error as ParseError;
2use syn::parse::Result as ParseResult;
3use syn::spanned::Spanned;
4use syn::Data;
5use syn::DeriveInput;
6use syn::Fields;
7
8use crate::types::trident_fuzz_test_methods::TridentFuzzTestMethodsStruct;
9
10pub fn parse_trident_fuzz_test_methods(
11    input: &DeriveInput,
12) -> ParseResult<TridentFuzzTestMethodsStruct> {
13    let ident = input.ident.clone();
14
15    // Get the struct fields
16    let fields = match &input.data {
17        Data::Struct(data) => match &data.fields {
18            Fields::Named(fields) => &fields.named,
19            _ => {
20                return Err(ParseError::new(
21                    input.span(),
22                    "FuzzTestMethods can only be derived for structs with named fields",
23                ))
24            }
25        },
26        _ => {
27            return Err(ParseError::new(
28                input.span(),
29                "FuzzTestMethods can only be derived for structs",
30            ))
31        }
32    };
33
34    // Find required fields
35    let trident_field = fields
36        .iter()
37        .find(|f| f.ident.as_ref().is_some_and(|id| id == "trident"))
38        .ok_or_else(|| ParseError::new(input.span(), "Struct must contain a 'trident' field"))?
39        .ident
40        .as_ref()
41        .unwrap()
42        .clone();
43
44    Ok(TridentFuzzTestMethodsStruct {
45        ident,
46        trident_field,
47    })
48}