1use proc_macro2::{Ident, Span}; 2use std::fmt::{self, Display}; 3 4#[derive(Copy, Clone)] 5pub struct Derive { 6 pub what: Trait, 7 pub span: Span, 8} 9 10#[derive(Copy, Clone, PartialEq)] 11pub enum Trait { 12 Clone, 13 Copy, 14 Debug, 15 Default, 16 Eq, 17 ExternType, 18 Hash, 19 Ord, 20 PartialEq, 21 PartialOrd, 22 Serialize, 23 Deserialize, 24} 25 26impl Derive { 27 pub fn from(ident: &Ident) -> Option<Self> { 28 let what = match ident.to_string().as_str() { 29 "Clone" => Trait::Clone, 30 "Copy" => Trait::Copy, 31 "Debug" => Trait::Debug, 32 "Default" => Trait::Default, 33 "Eq" => Trait::Eq, 34 "ExternType" => Trait::ExternType, 35 "Hash" => Trait::Hash, 36 "Ord" => Trait::Ord, 37 "PartialEq" => Trait::PartialEq, 38 "PartialOrd" => Trait::PartialOrd, 39 "Serialize" => Trait::Serialize, 40 "Deserialize" => Trait::Deserialize, 41 _ => return None, 42 }; 43 let span = ident.span(); 44 Some(Derive { what, span }) 45 } 46} 47 48impl PartialEq<Trait> for Derive { 49 fn eq(&self, other: &Trait) -> bool { 50 self.what == *other 51 } 52} 53 54impl AsRef<str> for Trait { 55 fn as_ref(&self) -> &str { 56 match self { 57 Trait::Clone => "Clone", 58 Trait::Copy => "Copy", 59 Trait::Debug => "Debug", 60 Trait::Default => "Default", 61 Trait::Eq => "Eq", 62 Trait::ExternType => "ExternType", 63 Trait::Hash => "Hash", 64 Trait::Ord => "Ord", 65 Trait::PartialEq => "PartialEq", 66 Trait::PartialOrd => "PartialOrd", 67 Trait::Serialize => "Serialize", 68 Trait::Deserialize => "Deserialize", 69 } 70 } 71} 72 73impl Display for Derive { 74 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { 75 formatter.write_str(self.what.as_ref()) 76 } 77} 78 79pub fn contains(derives: &[Derive], query: Trait) -> bool { 80 derives.iter().any(|derive| derive.what == query) 81} 82