blob: 1121211024ec7a9949a698c681381c78e07e0f5b [file] [log] [blame]
David Tolnayb247df12020-11-27 12:06:12 -08001use proc_macro2::{Ident, Span};
2
3#[derive(Copy, Clone)]
4pub struct Derive {
5 pub what: Trait,
6 pub span: Span,
7}
David Tolnay64703b42020-05-10 22:12:33 -07008
9#[derive(Copy, Clone, PartialEq)]
David Tolnayb247df12020-11-27 12:06:12 -080010pub enum Trait {
David Tolnay64703b42020-05-10 22:12:33 -070011 Clone,
12 Copy,
David Tolnayf84c98b2020-11-27 12:59:42 -080013 Debug,
David Tolnaya6a9e942020-11-27 17:22:35 -080014 Default,
David Tolnay21466df2020-11-27 14:04:42 -080015 Eq,
David Tolnay7da38202020-11-27 17:36:16 -080016 Hash,
David Tolnay577135e2020-11-27 16:23:53 -080017 Ord,
David Tolnay21466df2020-11-27 14:04:42 -080018 PartialEq,
David Tolnay577135e2020-11-27 16:23:53 -080019 PartialOrd,
David Tolnay64703b42020-05-10 22:12:33 -070020}
21
22impl Derive {
23 pub fn from(ident: &Ident) -> Option<Self> {
David Tolnayb247df12020-11-27 12:06:12 -080024 let what = match ident.to_string().as_str() {
25 "Clone" => Trait::Clone,
26 "Copy" => Trait::Copy,
David Tolnayf84c98b2020-11-27 12:59:42 -080027 "Debug" => Trait::Debug,
David Tolnaya6a9e942020-11-27 17:22:35 -080028 "Default" => Trait::Default,
David Tolnay21466df2020-11-27 14:04:42 -080029 "Eq" => Trait::Eq,
David Tolnay7da38202020-11-27 17:36:16 -080030 "Hash" => Trait::Hash,
David Tolnay577135e2020-11-27 16:23:53 -080031 "Ord" => Trait::Ord,
David Tolnay21466df2020-11-27 14:04:42 -080032 "PartialEq" => Trait::PartialEq,
David Tolnay577135e2020-11-27 16:23:53 -080033 "PartialOrd" => Trait::PartialOrd,
David Tolnayb247df12020-11-27 12:06:12 -080034 _ => return None,
35 };
36 let span = ident.span();
37 Some(Derive { what, span })
38 }
39}
40
41impl PartialEq<Trait> for Derive {
42 fn eq(&self, other: &Trait) -> bool {
43 self.what == *other
David Tolnay64703b42020-05-10 22:12:33 -070044 }
45}
David Tolnaybc047bb2020-11-27 14:30:12 -080046
David Tolnayb600e4f2020-11-27 17:26:49 -080047impl AsRef<str> for Trait {
48 fn as_ref(&self) -> &str {
49 match self {
50 Trait::Clone => "Clone",
51 Trait::Copy => "Copy",
52 Trait::Debug => "Debug",
David Tolnaya6a9e942020-11-27 17:22:35 -080053 Trait::Default => "Default",
David Tolnayb600e4f2020-11-27 17:26:49 -080054 Trait::Eq => "Eq",
David Tolnay7da38202020-11-27 17:36:16 -080055 Trait::Hash => "Hash",
David Tolnayb600e4f2020-11-27 17:26:49 -080056 Trait::Ord => "Ord",
57 Trait::PartialEq => "PartialEq",
58 Trait::PartialOrd => "PartialOrd",
59 }
60 }
61}
62
David Tolnaybc047bb2020-11-27 14:30:12 -080063pub fn contains(derives: &[Derive], query: Trait) -> bool {
64 derives.iter().any(|derive| derive.what == query)
65}