133d722a9Sopenharmony_ciuse proc_macro2::{Ident, Span}; 233d722a9Sopenharmony_ciuse std::fmt::{self, Display}; 333d722a9Sopenharmony_ci 433d722a9Sopenharmony_ci#[derive(Copy, Clone)] 533d722a9Sopenharmony_cipub struct Derive { 633d722a9Sopenharmony_ci pub what: Trait, 733d722a9Sopenharmony_ci pub span: Span, 833d722a9Sopenharmony_ci} 933d722a9Sopenharmony_ci 1033d722a9Sopenharmony_ci#[derive(Copy, Clone, PartialEq)] 1133d722a9Sopenharmony_cipub enum Trait { 1233d722a9Sopenharmony_ci Clone, 1333d722a9Sopenharmony_ci Copy, 1433d722a9Sopenharmony_ci Debug, 1533d722a9Sopenharmony_ci Default, 1633d722a9Sopenharmony_ci Eq, 1733d722a9Sopenharmony_ci ExternType, 1833d722a9Sopenharmony_ci Hash, 1933d722a9Sopenharmony_ci Ord, 2033d722a9Sopenharmony_ci PartialEq, 2133d722a9Sopenharmony_ci PartialOrd, 2233d722a9Sopenharmony_ci Serialize, 2333d722a9Sopenharmony_ci Deserialize, 2433d722a9Sopenharmony_ci} 2533d722a9Sopenharmony_ci 2633d722a9Sopenharmony_ciimpl Derive { 2733d722a9Sopenharmony_ci pub fn from(ident: &Ident) -> Option<Self> { 2833d722a9Sopenharmony_ci let what = match ident.to_string().as_str() { 2933d722a9Sopenharmony_ci "Clone" => Trait::Clone, 3033d722a9Sopenharmony_ci "Copy" => Trait::Copy, 3133d722a9Sopenharmony_ci "Debug" => Trait::Debug, 3233d722a9Sopenharmony_ci "Default" => Trait::Default, 3333d722a9Sopenharmony_ci "Eq" => Trait::Eq, 3433d722a9Sopenharmony_ci "ExternType" => Trait::ExternType, 3533d722a9Sopenharmony_ci "Hash" => Trait::Hash, 3633d722a9Sopenharmony_ci "Ord" => Trait::Ord, 3733d722a9Sopenharmony_ci "PartialEq" => Trait::PartialEq, 3833d722a9Sopenharmony_ci "PartialOrd" => Trait::PartialOrd, 3933d722a9Sopenharmony_ci "Serialize" => Trait::Serialize, 4033d722a9Sopenharmony_ci "Deserialize" => Trait::Deserialize, 4133d722a9Sopenharmony_ci _ => return None, 4233d722a9Sopenharmony_ci }; 4333d722a9Sopenharmony_ci let span = ident.span(); 4433d722a9Sopenharmony_ci Some(Derive { what, span }) 4533d722a9Sopenharmony_ci } 4633d722a9Sopenharmony_ci} 4733d722a9Sopenharmony_ci 4833d722a9Sopenharmony_ciimpl PartialEq<Trait> for Derive { 4933d722a9Sopenharmony_ci fn eq(&self, other: &Trait) -> bool { 5033d722a9Sopenharmony_ci self.what == *other 5133d722a9Sopenharmony_ci } 5233d722a9Sopenharmony_ci} 5333d722a9Sopenharmony_ci 5433d722a9Sopenharmony_ciimpl AsRef<str> for Trait { 5533d722a9Sopenharmony_ci fn as_ref(&self) -> &str { 5633d722a9Sopenharmony_ci match self { 5733d722a9Sopenharmony_ci Trait::Clone => "Clone", 5833d722a9Sopenharmony_ci Trait::Copy => "Copy", 5933d722a9Sopenharmony_ci Trait::Debug => "Debug", 6033d722a9Sopenharmony_ci Trait::Default => "Default", 6133d722a9Sopenharmony_ci Trait::Eq => "Eq", 6233d722a9Sopenharmony_ci Trait::ExternType => "ExternType", 6333d722a9Sopenharmony_ci Trait::Hash => "Hash", 6433d722a9Sopenharmony_ci Trait::Ord => "Ord", 6533d722a9Sopenharmony_ci Trait::PartialEq => "PartialEq", 6633d722a9Sopenharmony_ci Trait::PartialOrd => "PartialOrd", 6733d722a9Sopenharmony_ci Trait::Serialize => "Serialize", 6833d722a9Sopenharmony_ci Trait::Deserialize => "Deserialize", 6933d722a9Sopenharmony_ci } 7033d722a9Sopenharmony_ci } 7133d722a9Sopenharmony_ci} 7233d722a9Sopenharmony_ci 7333d722a9Sopenharmony_ciimpl Display for Derive { 7433d722a9Sopenharmony_ci fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 7533d722a9Sopenharmony_ci formatter.write_str(self.what.as_ref()) 7633d722a9Sopenharmony_ci } 7733d722a9Sopenharmony_ci} 7833d722a9Sopenharmony_ci 7933d722a9Sopenharmony_cipub fn contains(derives: &[Derive], query: Trait) -> bool { 8033d722a9Sopenharmony_ci derives.iter().any(|derive| derive.what == query) 8133d722a9Sopenharmony_ci} 82