blob: 813cf2626b79b7ef776a6228a00c16b8a231e1b7 [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 Tolnay21466df2020-11-27 14:04:42 -080014 Eq,
David Tolnay577135e2020-11-27 16:23:53 -080015 Ord,
David Tolnay21466df2020-11-27 14:04:42 -080016 PartialEq,
David Tolnay577135e2020-11-27 16:23:53 -080017 PartialOrd,
David Tolnay64703b42020-05-10 22:12:33 -070018}
19
20impl Derive {
21 pub fn from(ident: &Ident) -> Option<Self> {
David Tolnayb247df12020-11-27 12:06:12 -080022 let what = match ident.to_string().as_str() {
23 "Clone" => Trait::Clone,
24 "Copy" => Trait::Copy,
David Tolnayf84c98b2020-11-27 12:59:42 -080025 "Debug" => Trait::Debug,
David Tolnay21466df2020-11-27 14:04:42 -080026 "Eq" => Trait::Eq,
David Tolnay577135e2020-11-27 16:23:53 -080027 "Ord" => Trait::Ord,
David Tolnay21466df2020-11-27 14:04:42 -080028 "PartialEq" => Trait::PartialEq,
David Tolnay577135e2020-11-27 16:23:53 -080029 "PartialOrd" => Trait::PartialOrd,
David Tolnayb247df12020-11-27 12:06:12 -080030 _ => return None,
31 };
32 let span = ident.span();
33 Some(Derive { what, span })
34 }
35}
36
37impl PartialEq<Trait> for Derive {
38 fn eq(&self, other: &Trait) -> bool {
39 self.what == *other
David Tolnay64703b42020-05-10 22:12:33 -070040 }
41}
David Tolnaybc047bb2020-11-27 14:30:12 -080042
David Tolnayb600e4f2020-11-27 17:26:49 -080043impl AsRef<str> for Trait {
44 fn as_ref(&self) -> &str {
45 match self {
46 Trait::Clone => "Clone",
47 Trait::Copy => "Copy",
48 Trait::Debug => "Debug",
49 Trait::Eq => "Eq",
50 Trait::Ord => "Ord",
51 Trait::PartialEq => "PartialEq",
52 Trait::PartialOrd => "PartialOrd",
53 }
54 }
55}
56
David Tolnaybc047bb2020-11-27 14:30:12 -080057pub fn contains(derives: &[Derive], query: Trait) -> bool {
58 derives.iter().any(|derive| derive.what == query)
59}