trident_syn/parser/
trident_fuzz_test_methods.rs1use 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 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 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}