git.delta.rocks / unique-network / refs/commits / 38998e8fae82

difftreelog

refac: impl_abi_macro

Trubnikov Sergey2022-11-22parent: #36bc522.patch.diff
in: master

1 file changed

modifiedcrates/evm-coder/procedural/src/abi_derive.rsdiffbeforeafterboth
4 let name = &ast.ident;4 let name = &ast.ident;
5 let docs = extract_docs(&ast.attrs)?;5 let docs = extract_docs(&ast.attrs)?;
66
7 let (is_named_fields, field_names, field_types, field_docs, params_count) = match &ast.data {7 match &ast.data {
8 syn::Data::Struct(ds) => match ds.fields {8 syn::Data::Struct(ds) => {
9 let (is_named_fields, field_names, field_types, field_docs, params_count) =
10 match ds.fields {
9 syn::Fields::Named(ref fields) => Ok((11 syn::Fields::Named(ref fields) => Ok((
10 true,12 true,
20 fields.unnamed.iter().map(map_field_to_doc),22 fields.unnamed.iter().map(map_field_to_doc),
21 fields.unnamed.len(),23 fields.unnamed.len(),
22 )),24 )),
23 syn::Fields::Unit => Err(syn::Error::new(name.span(), "Unit structs not supported")),25 syn::Fields::Unit => {
26 Err(syn::Error::new(name.span(), "Unit structs not supported"))
27 }
24 },28 }?;
29
30 if params_count == 0 {
31 return Err(syn::Error::new(name.span(), "Empty structs not supported"));
32 };
33
34 let tuple_type = tuple_type(field_types.clone());
35 let tuple_ref_type = tuple_ref_type(field_types.clone());
36 let tuple_data = tuple_data_as_ref(is_named_fields, field_names.clone());
37 let tuple_names = tuple_names(is_named_fields, field_names.clone());
38 let struct_from_tuple = struct_from_tuple(name, is_named_fields, field_names.clone());
39
40 let can_be_plcaed_in_vec = impl_can_be_placed_in_vec(name);
41 let abi_type = impl_abi_type(name, tuple_type.clone());
42 let abi_read = impl_abi_read(name, tuple_type, tuple_names, struct_from_tuple);
43 let abi_write = impl_abi_write(name, is_named_fields, tuple_ref_type, tuple_data);
44 let solidity_type = impl_solidity_type(name, field_types.clone(), params_count);
45 let solidity_type_name =
46 impl_solidity_type_name(name, field_types.clone(), params_count);
47 let solidity_struct_collect =
48 impl_solidity_struct_collect(name, field_names, field_types, field_docs, &docs)?;
49
50 Ok(quote! {
51 #can_be_plcaed_in_vec
52 #abi_type
53 #abi_read
54 #abi_write
55 #solidity_type
56 #solidity_type_name
57 #solidity_struct_collect
58 })
59 }
25 syn::Data::Enum(_) => Err(syn::Error::new(name.span(), "Enums not supported")),60 syn::Data::Enum(_) => Err(syn::Error::new(name.span(), "Enums not supported")),
26 syn::Data::Union(_) => Err(syn::Error::new(name.span(), "Unions not supported")),61 syn::Data::Union(_) => Err(syn::Error::new(name.span(), "Unions not supported")),
27 }?;62 }
28
29 if params_count == 0 {
30 return Err(syn::Error::new(name.span(), "Empty structs not supported"));
31 };
32
33 let tuple_type = tuple_type(field_types.clone());
34 let tuple_ref_type = tuple_ref_type(field_types.clone());
35 let tuple_data = tuple_data_as_ref(is_named_fields, field_names.clone());
36 let tuple_names = tuple_names(is_named_fields, field_names.clone());
37 let struct_from_tuple = struct_from_tuple(name, is_named_fields, field_names.clone());
38
39 let can_be_plcaed_in_vec = impl_can_be_placed_in_vec(name);
40 let abi_type = impl_abi_type(name, tuple_type.clone());
41 let abi_read = impl_abi_read(name, tuple_type, tuple_names, struct_from_tuple);
42 let abi_write = impl_abi_write(name, is_named_fields, tuple_ref_type, tuple_data);
43 let solidity_type = impl_solidity_type(name, field_types.clone(), params_count);
44 let solidity_type_name = impl_solidity_type_name(name, field_types.clone(), params_count);
45 let solidity_struct_collect =
46 impl_solidity_struct_collect(name, field_names, field_types, field_docs, &docs)?;
47
48 Ok(quote! {
49 #can_be_plcaed_in_vec
50 #abi_type
51 #abi_read
52 #abi_write
53 #solidity_type
54 #solidity_type_name
55 #solidity_struct_collect
56 })
57}63}
5864
59fn tuple_type<'a>(65fn tuple_type<'a>(