cxx_gen/syntax/
derive.rs

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}