blob: 96b3eea75548f7cb936913fd2e01ebf8a8ba39d2 [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)]
5pub struct Derive {
6 pub what: Trait,
7 pub span: Span,
8}
David Tolnay64703b42020-05-10 22:12:33 -07009
10#[derive(Copy, Clone, PartialEq)]
David Tolnayb247df12020-11-27 12:06:12 -080011pub 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,
David Tolnay64703b42020-05-10 22:12:33 -070022}
23
24impl Derive {
25 pub fn from(ident: &Ident) -> Option<Self> {
David Tolnayb247df12020-11-27 12:06:12 -080026 let what = match ident.to_string().as_str() {
27 "Clone" => Trait::Clone,
28 "Copy" => Trait::Copy,
David Tolnayf84c98b2020-11-27 12:59:42 -080029 "Debug" => Trait::Debug,
David Tolnaya6a9e942020-11-27 17:22:35 -080030 "Default" => Trait::Default,
David Tolnay21466df2020-11-27 14:04:42 -080031 "Eq" => Trait::Eq,
David Tolnay16e26202020-11-27 19:28:37 -080032 "ExternType" => Trait::ExternType,
David Tolnay7da38202020-11-27 17:36:16 -080033 "Hash" => Trait::Hash,
David Tolnay577135e2020-11-27 16:23:53 -080034 "Ord" => Trait::Ord,
David Tolnay21466df2020-11-27 14:04:42 -080035 "PartialEq" => Trait::PartialEq,
David Tolnay577135e2020-11-27 16:23:53 -080036 "PartialOrd" => Trait::PartialOrd,
David Tolnayb247df12020-11-27 12:06:12 -080037 _ => return None,
38 };
39 let span = ident.span();
40 Some(Derive { what, span })
41 }
42}
43
44impl PartialEq<Trait> for Derive {
45 fn eq(&self, other: &Trait) -> bool {
46 self.what == *other
David Tolnay64703b42020-05-10 22:12:33 -070047 }
48}
David Tolnaybc047bb2020-11-27 14:30:12 -080049
David Tolnayb600e4f2020-11-27 17:26:49 -080050impl AsRef<str> for Trait {
51 fn as_ref(&self) -> &str {
52 match self {
53 Trait::Clone => "Clone",
54 Trait::Copy => "Copy",
55 Trait::Debug => "Debug",
David Tolnaya6a9e942020-11-27 17:22:35 -080056 Trait::Default => "Default",
David Tolnayb600e4f2020-11-27 17:26:49 -080057 Trait::Eq => "Eq",
David Tolnay16e26202020-11-27 19:28:37 -080058 Trait::ExternType => "ExternType",
David Tolnay7da38202020-11-27 17:36:16 -080059 Trait::Hash => "Hash",
David Tolnayb600e4f2020-11-27 17:26:49 -080060 Trait::Ord => "Ord",
61 Trait::PartialEq => "PartialEq",
62 Trait::PartialOrd => "PartialOrd",
63 }
64 }
65}
66
David Tolnay16e26202020-11-27 19:28:37 -080067impl Display for Derive {
68 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
69 formatter.write_str(self.what.as_ref())
70 }
71}
72
David Tolnaybc047bb2020-11-27 14:30:12 -080073pub fn contains(derives: &[Derive], query: Trait) -> bool {
74 derives.iter().any(|derive| derive.what == query)
75}