1use proc_macro2::{Ident, Span};
2use std::fmt::{self, Display};
3
4#[derive(Copy, Clone)]
5pub(crate) struct Derive {
6 pub what: Trait,
7 pub span: Span,
8}
9
10#[derive(Copy, Clone, PartialEq)]
11pub(crate) 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(crate) 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(crate) fn contains(derives: &[Derive], query: Trait) -> bool {
80 derives.iter().any(|derive| derive.what == query)
81}