blob: 109996701b505022427a937adf8bddba4201d710 [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
43pub fn contains(derives: &[Derive], query: Trait) -> bool {
44 derives.iter().any(|derive| derive.what == query)
45}