difftreelog
fix clippy
in: master
2 files changed
crates/evm-coder/procedural/src/abi_derive/derive_enum.rsdiffbeforeafterboth1use quote::quote;23pub fn impl_solidity_option<'a>(4 name: &proc_macro2::Ident,5 enum_options: impl Iterator<Item = &'a syn::Ident>,6) -> proc_macro2::TokenStream {7 let enum_options = enum_options.map(|opt| {8 let s = name.to_string() + "." + opt.to_string().as_str();9 let as_string = proc_macro2::Literal::string(s.as_str());10 quote!(#name::#opt => #as_string,)11 });12 quote!(13 #[cfg(feature = "stubgen")]14 impl ::evm_coder::solidity::SolidityEnum for #name {15 fn solidity_option(&self) -> &str {16 match self {17 #(#enum_options)*18 }19 }20 }21 )22}2324pub fn impl_enum_from_u8<'a>(25 name: &proc_macro2::Ident,26 enum_options: impl Iterator<Item = &'a syn::Ident>,27) -> proc_macro2::TokenStream {28 let error_str = format!("Value not convertible into enum \"{name}\"");29 let error_str = proc_macro2::Literal::string(&error_str);30 let enum_options = enum_options.enumerate().map(|(i, opt)| {31 let n = proc_macro2::Literal::u8_suffixed(i as u8);32 quote! {#n => Ok(#name::#opt),}33 });3435 quote!(36 impl TryFrom<u8> for #name {37 type Error = &'static str;3839 fn try_from(value: u8) -> ::core::result::Result<Self, Self::Error> {40 const err: &'static str = #error_str;41 match value {42 #(#enum_options)*43 _ => Err(err)44 }45 }46 }47 )48}4950pub fn impl_enum_abi_type(name: &syn::Ident) -> proc_macro2::TokenStream {51 quote! {52 impl ::evm_coder::abi::AbiType for #name {53 const SIGNATURE: ::evm_coder::custom_signature::SignatureUnit = <u8 as ::evm_coder::abi::AbiType>::SIGNATURE;5455 fn is_dynamic() -> bool {56 <u8 as ::evm_coder::abi::AbiType>::is_dynamic()57 }58 fn size() -> usize {59 <u8 as ::evm_coder::abi::AbiType>::size()60 }61 }62 }63}6465pub fn impl_enum_abi_read(name: &syn::Ident) -> proc_macro2::TokenStream {66 quote!(67 impl ::evm_coder::abi::AbiRead for #name {68 fn abi_read(reader: &mut ::evm_coder::abi::AbiReader) -> ::evm_coder::execution::Result<Self> {69 Ok(70 <u8 as ::evm_coder::abi::AbiRead>::abi_read(reader)?71 .try_into()?72 )73 }74 }75 )76}7778pub fn impl_enum_abi_write(name: &syn::Ident) -> proc_macro2::TokenStream {79 quote!(80 impl ::evm_coder::abi::AbiWrite for #name {81 fn abi_write(&self, writer: &mut ::evm_coder::abi::AbiWriter) {82 ::evm_coder::abi::AbiWrite::abi_write(&(*self as u8), writer);83 }84 }85 )86}8788pub fn impl_enum_solidity_type_name<'a>(name: &syn::Ident) -> proc_macro2::TokenStream {89 quote!(90 #[cfg(feature = "stubgen")]91 impl ::evm_coder::solidity::SolidityTypeName for #name {92 fn solidity_name(93 writer: &mut impl ::core::fmt::Write,94 tc: &::evm_coder::solidity::TypeCollector,95 ) -> ::core::fmt::Result {96 write!(writer, "{}", tc.collect_struct::<Self>())97 }9899 fn is_simple() -> bool {100 true101 }102103 fn solidity_default(104 writer: &mut impl ::core::fmt::Write,105 tc: &::evm_coder::solidity::TypeCollector,106 ) -> ::core::fmt::Result {107 write!(writer, "{}", <#name as ::evm_coder::solidity::SolidityEnum>::solidity_option(&<#name>::default()))108 }109 }110 )111}112113pub fn impl_enum_solidity_struct_collect<'a>(114 name: &syn::Ident,115 enum_options: impl Iterator<Item = &'a syn::Ident>,116 option_count: usize,117 enum_options_docs: impl Iterator<Item = syn::Result<Vec<proc_macro2::TokenStream>>>,118 docs: &[proc_macro2::TokenStream],119) -> proc_macro2::TokenStream {120 let string_name = name.to_string();121 let enum_options = enum_options122 .zip(enum_options_docs)123 .enumerate()124 .map(|(i, (opt, doc))| {125 let opt = proc_macro2::Literal::string(opt.to_string().as_str());126 let doc = doc.expect("Doc parsing error");127 let comma = if i != option_count - 1 { "," } else { "" };128 quote! {129 #(#doc)*130 writeln!(str, "\t{}{}", #opt, #comma).expect("Enum format option");131 }132 });133134 quote!(135 #[cfg(feature = "stubgen")]136 impl ::evm_coder::solidity::StructCollect for #name {137 fn name() -> String {138 #string_name.into()139 }140141 fn declaration() -> String {142 use std::fmt::Write;143144 let mut str = String::new();145 #(#docs)*146 writeln!(str, "enum {} {{", <Self as ::evm_coder::solidity::StructCollect>::name()).unwrap();147 #(#enum_options)*148 writeln!(str, "}}").unwrap();149 str150 }151 }152 )153}154155pub fn check_and_count_options(de: &syn::DataEnum) -> syn::Result<usize> {156 let mut count = 0;157 for error in de.variants.iter().filter_map(|v| {158 if !v.fields.is_empty() {159 Some(Err(syn::Error::new(160 v.ident.span(),161 "Enumeration parameters should not have fields",162 )))163 } else if v.discriminant.is_some() {164 Some(Err(syn::Error::new(165 v.ident.span(),166 "Enumeration options should not have an explicit specified value",167 )))168 } else {169 count += 1;170 None171 }172 }) {173 return error;174 }175176 Ok(count)177}178179pub fn check_repr_u8(name: &syn::Ident, attrs: &Vec<syn::Attribute>) -> syn::Result<()> {180 let mut has_repr = false;181 for attr in attrs.iter() {182 if attr.path.is_ident("repr") {183 has_repr = true;184 let meta = attr.parse_meta()?;185 check_meta_u8(&meta)?;186 }187 }188189 if !has_repr {190 return Err(syn::Error::new(name.span(), "Enum is not \"repr(u8)\""));191 }192193 Ok(())194}195196fn check_meta_u8(meta: &syn::Meta) -> Result<(), syn::Error> {197 if let syn::Meta::List(p) = meta {198 for nm in p.nested.iter() {199 if let syn::NestedMeta::Meta(m) = nm {200 if let syn::Meta::Path(p) = m {201 if !p.is_ident("u8") {202 return Err(syn::Error::new(203 p.segments204 .first()205 .expect("repr segments are empty")206 .ident207 .span(),208 "Enum is not \"repr(u8)\"",209 ));210 }211 }212 }213 }214 }215 Ok(())216}1use quote::quote;23pub fn impl_solidity_option<'a>(4 name: &proc_macro2::Ident,5 enum_options: impl Iterator<Item = &'a syn::Ident>,6) -> proc_macro2::TokenStream {7 let enum_options = enum_options.map(|opt| {8 let s = name.to_string() + "." + opt.to_string().as_str();9 let as_string = proc_macro2::Literal::string(s.as_str());10 quote!(#name::#opt => #as_string,)11 });12 quote!(13 #[cfg(feature = "stubgen")]14 impl ::evm_coder::solidity::SolidityEnum for #name {15 fn solidity_option(&self) -> &str {16 match self {17 #(#enum_options)*18 }19 }20 }21 )22}2324pub fn impl_enum_from_u8<'a>(25 name: &proc_macro2::Ident,26 enum_options: impl Iterator<Item = &'a syn::Ident>,27) -> proc_macro2::TokenStream {28 let error_str = format!("Value not convertible into enum \"{name}\"");29 let error_str = proc_macro2::Literal::string(&error_str);30 let enum_options = enum_options.enumerate().map(|(i, opt)| {31 let n = proc_macro2::Literal::u8_suffixed(i as u8);32 quote! {#n => Ok(#name::#opt),}33 });3435 quote!(36 impl TryFrom<u8> for #name {37 type Error = &'static str;3839 fn try_from(value: u8) -> ::core::result::Result<Self, Self::Error> {40 const err: &'static str = #error_str;41 match value {42 #(#enum_options)*43 _ => Err(err)44 }45 }46 }47 )48}4950pub fn impl_enum_abi_type(name: &syn::Ident) -> proc_macro2::TokenStream {51 quote! {52 impl ::evm_coder::abi::AbiType for #name {53 const SIGNATURE: ::evm_coder::custom_signature::SignatureUnit = <u8 as ::evm_coder::abi::AbiType>::SIGNATURE;5455 fn is_dynamic() -> bool {56 <u8 as ::evm_coder::abi::AbiType>::is_dynamic()57 }58 fn size() -> usize {59 <u8 as ::evm_coder::abi::AbiType>::size()60 }61 }62 }63}6465pub fn impl_enum_abi_read(name: &syn::Ident) -> proc_macro2::TokenStream {66 quote!(67 impl ::evm_coder::abi::AbiRead for #name {68 fn abi_read(reader: &mut ::evm_coder::abi::AbiReader) -> ::evm_coder::execution::Result<Self> {69 Ok(70 <u8 as ::evm_coder::abi::AbiRead>::abi_read(reader)?71 .try_into()?72 )73 }74 }75 )76}7778pub fn impl_enum_abi_write(name: &syn::Ident) -> proc_macro2::TokenStream {79 quote!(80 impl ::evm_coder::abi::AbiWrite for #name {81 fn abi_write(&self, writer: &mut ::evm_coder::abi::AbiWriter) {82 ::evm_coder::abi::AbiWrite::abi_write(&(*self as u8), writer);83 }84 }85 )86}8788pub fn impl_enum_solidity_type_name(name: &syn::Ident) -> proc_macro2::TokenStream {89 quote!(90 #[cfg(feature = "stubgen")]91 impl ::evm_coder::solidity::SolidityTypeName for #name {92 fn solidity_name(93 writer: &mut impl ::core::fmt::Write,94 tc: &::evm_coder::solidity::TypeCollector,95 ) -> ::core::fmt::Result {96 write!(writer, "{}", tc.collect_struct::<Self>())97 }9899 fn is_simple() -> bool {100 true101 }102103 fn solidity_default(104 writer: &mut impl ::core::fmt::Write,105 tc: &::evm_coder::solidity::TypeCollector,106 ) -> ::core::fmt::Result {107 write!(writer, "{}", <#name as ::evm_coder::solidity::SolidityEnum>::solidity_option(&<#name>::default()))108 }109 }110 )111}112113pub fn impl_enum_solidity_struct_collect<'a>(114 name: &syn::Ident,115 enum_options: impl Iterator<Item = &'a syn::Ident>,116 option_count: usize,117 enum_options_docs: impl Iterator<Item = syn::Result<Vec<proc_macro2::TokenStream>>>,118 docs: &[proc_macro2::TokenStream],119) -> proc_macro2::TokenStream {120 let string_name = name.to_string();121 let enum_options = enum_options122 .zip(enum_options_docs)123 .enumerate()124 .map(|(i, (opt, doc))| {125 let opt = proc_macro2::Literal::string(opt.to_string().as_str());126 let doc = doc.expect("Doc parsing error");127 let comma = if i != option_count - 1 { "," } else { "" };128 quote! {129 #(#doc)*130 writeln!(str, "\t{}{}", #opt, #comma).expect("Enum format option");131 }132 });133134 quote!(135 #[cfg(feature = "stubgen")]136 impl ::evm_coder::solidity::StructCollect for #name {137 fn name() -> String {138 #string_name.into()139 }140141 fn declaration() -> String {142 use std::fmt::Write;143144 let mut str = String::new();145 #(#docs)*146 writeln!(str, "enum {} {{", <Self as ::evm_coder::solidity::StructCollect>::name()).unwrap();147 #(#enum_options)*148 writeln!(str, "}}").unwrap();149 str150 }151 }152 )153}154155pub fn check_and_count_options(de: &syn::DataEnum) -> syn::Result<usize> {156 let mut count = 0;157 for v in de.variants.iter() {158 if !v.fields.is_empty() {159 return Err(syn::Error::new(160 v.ident.span(),161 "Enumeration parameters should not have fields",162 ));163 } else if v.discriminant.is_some() {164 return Err(syn::Error::new(165 v.ident.span(),166 "Enumeration options should not have an explicit specified value",167 ));168 } else {169 count += 1;170 }171 }172173 Ok(count)174}175176pub fn check_repr_u8(name: &syn::Ident, attrs: &[syn::Attribute]) -> syn::Result<()> {177 let mut has_repr = false;178 for attr in attrs.iter() {179 if attr.path.is_ident("repr") {180 has_repr = true;181 let meta = attr.parse_meta()?;182 check_meta_u8(&meta)?;183 }184 }185186 if !has_repr {187 return Err(syn::Error::new(name.span(), "Enum is not \"repr(u8)\""));188 }189190 Ok(())191}192193fn check_meta_u8(meta: &syn::Meta) -> Result<(), syn::Error> {194 if let syn::Meta::List(p) = meta {195 for nm in p.nested.iter() {196 if let syn::NestedMeta::Meta(syn::Meta::Path(p)) = nm {197 if !p.is_ident("u8") {198 return Err(syn::Error::new(199 p.segments200 .first()201 .expect("repr segments are empty")202 .ident203 .span(),204 "Enum is not \"repr(u8)\"",205 ));206 }207 }208 }209 }210 Ok(())211}crates/evm-coder/src/solidity/mod.rsdiffbeforeafterboth--- a/crates/evm-coder/src/solidity/mod.rs
+++ b/crates/evm-coder/src/solidity/mod.rs
@@ -276,7 +276,7 @@
writer: &mut impl fmt::Write,
tc: &TypeCollector,
) -> fmt::Result {
- let hide_comment = self.hide.then(|| "// ").unwrap_or("");
+ let hide_comment = self.hide.then_some("// ").unwrap();
for doc in self.docs {
writeln!(writer, "\t{hide_comment}///{}", doc)?;
}