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