blob: 9e09461c3fa6498cbbd85c7047d0ba828bd67115 [file] [log] [blame]
David Tolnayb247df12020-11-27 12:06:12 -08001use proc_macro2::{Ident, Span};
David Tolnay16e26202020-11-27 19:28:37 -08002use std::fmt::{self, Display};
David Tolnayb247df12020-11-27 12:06:12 -08003
4#[derive(Copy, Clone)]
David Tolnay886fff82023-09-03 12:48:23 -07005pub(crate) struct Derive {
David Tolnayb247df12020-11-27 12:06:12 -08006 pub what: Trait,
7 pub span: Span,
8}
David Tolnay64703b42020-05-10 22:12:33 -07009
10#[derive(Copy, Clone, PartialEq)]
David Tolnay886fff82023-09-03 12:48:23 -070011pub(crate) enum Trait {
David Tolnay64703b42020-05-10 22:12:33 -070012 Clone,
13 Copy,
David Tolnayf84c98b2020-11-27 12:59:42 -080014 Debug,
David Tolnaya6a9e942020-11-27 17:22:35 -080015 Default,
David Tolnay21466df2020-11-27 14:04:42 -080016 Eq,
David Tolnay16e26202020-11-27 19:28:37 -080017 ExternType,
David Tolnay7da38202020-11-27 17:36:16 -080018 Hash,
David Tolnay577135e2020-11-27 16:23:53 -080019 Ord,
David Tolnay21466df2020-11-27 14:04:42 -080020 PartialEq,
David Tolnay577135e2020-11-27 16:23:53 -080021 PartialOrd,
Johan Verweyb3ac95e2021-09-25 07:54:24 -070022 Serialize,
23 Deserialize,
David Tolnay64703b42020-05-10 22:12:33 -070024}
25
26impl Derive {
David Tolnay886fff82023-09-03 12:48:23 -070027 pub(crate) fn from(ident: &Ident) -> Option<Self> {
David Tolnayb247df12020-11-27 12:06:12 -080028 let what = match ident.to_string().as_str() {
29 "Clone" => Trait::Clone,
30 "Copy" => Trait::Copy,
David Tolnayf84c98b2020-11-27 12:59:42 -080031 "Debug" => Trait::Debug,
David Tolnaya6a9e942020-11-27 17:22:35 -080032 "Default" => Trait::Default,
David Tolnay21466df2020-11-27 14:04:42 -080033 "Eq" => Trait::Eq,
David Tolnay16e26202020-11-27 19:28:37 -080034 "ExternType" => Trait::ExternType,
David Tolnay7da38202020-11-27 17:36:16 -080035 "Hash" => Trait::Hash,
David Tolnay577135e2020-11-27 16:23:53 -080036 "Ord" => Trait::Ord,
David Tolnay21466df2020-11-27 14:04:42 -080037 "PartialEq" => Trait::PartialEq,
David Tolnay577135e2020-11-27 16:23:53 -080038 "PartialOrd" => Trait::PartialOrd,
Johan Verweyb3ac95e2021-09-25 07:54:24 -070039 "Serialize" => Trait::Serialize,
40 "Deserialize" => Trait::Deserialize,
David Tolnayb247df12020-11-27 12:06:12 -080041 _ => 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
David Tolnay64703b42020-05-10 22:12:33 -070051 }
52}
David Tolnaybc047bb2020-11-27 14:30:12 -080053
David Tolnayb600e4f2020-11-27 17:26:49 -080054impl 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",
David Tolnaya6a9e942020-11-27 17:22:35 -080060 Trait::Default => "Default",
David Tolnayb600e4f2020-11-27 17:26:49 -080061 Trait::Eq => "Eq",
David Tolnay16e26202020-11-27 19:28:37 -080062 Trait::ExternType => "ExternType",
David Tolnay7da38202020-11-27 17:36:16 -080063 Trait::Hash => "Hash",
David Tolnayb600e4f2020-11-27 17:26:49 -080064 Trait::Ord => "Ord",
65 Trait::PartialEq => "PartialEq",
66 Trait::PartialOrd => "PartialOrd",
Johan Verweyb3ac95e2021-09-25 07:54:24 -070067 Trait::Serialize => "Serialize",
68 Trait::Deserialize => "Deserialize",
David Tolnayb600e4f2020-11-27 17:26:49 -080069 }
70 }
71}
72
David Tolnay16e26202020-11-27 19:28:37 -080073impl Display for Derive {
74 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
75 formatter.write_str(self.what.as_ref())
76 }
77}
78
David Tolnay927d8ea2023-09-03 12:14:45 -070079pub(crate) fn contains(derives: &[Derive], query: Trait) -> bool {
David Tolnaybc047bb2020-11-27 14:30:12 -080080 derives.iter().any(|derive| derive.what == query)
81}