git.delta.rocks / unique-network / refs/commits / 7b633dc2f17c

difftreelog

fix clippy

Trubnikov Sergey2022-12-02parent: #ad92b1d.patch.diff
in: master

2 files changed

modifiedcrates/evm-coder/procedural/src/abi_derive/derive_enum.rsdiffbeforeafterboth
before · crates/evm-coder/procedural/src/abi_derive/derive_enum.rs
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<'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}
after · crates/evm-coder/procedural/src/abi_derive/derive_enum.rs
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}
modifiedcrates/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)?;
 		}