• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 use proc_macro2::{Ident, Span};
2 use std::fmt::{self, Display};
3 
4 #[derive(Copy, Clone)]
5 pub struct Derive {
6     pub what: Trait,
7     pub span: Span,
8 }
9 
10 #[derive(Copy, Clone, PartialEq)]
11 pub 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 
26 impl Derive {
from(ident: &Ident) -> Option<Self>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 
48 impl PartialEq<Trait> for Derive {
eq(&self, other: &Trait) -> bool49     fn eq(&self, other: &Trait) -> bool {
50         self.what == *other
51     }
52 }
53 
54 impl AsRef<str> for Trait {
as_ref(&self) -> &str55     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 
73 impl Display for Derive {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result74     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
75         formatter.write_str(self.what.as_ref())
76     }
77 }
78 
contains(derives: &[Derive], query: Trait) -> bool79 pub fn contains(derives: &[Derive], query: Trait) -> bool {
80     derives.iter().any(|derive| derive.what == query)
81 }
82