133d722a9Sopenharmony_ciuse proc_macro2::{Ident, Span};
233d722a9Sopenharmony_ciuse std::fmt::{self, Display};
333d722a9Sopenharmony_ci
433d722a9Sopenharmony_ci#[derive(Copy, Clone)]
533d722a9Sopenharmony_cipub struct Derive {
633d722a9Sopenharmony_ci    pub what: Trait,
733d722a9Sopenharmony_ci    pub span: Span,
833d722a9Sopenharmony_ci}
933d722a9Sopenharmony_ci
1033d722a9Sopenharmony_ci#[derive(Copy, Clone, PartialEq)]
1133d722a9Sopenharmony_cipub enum Trait {
1233d722a9Sopenharmony_ci    Clone,
1333d722a9Sopenharmony_ci    Copy,
1433d722a9Sopenharmony_ci    Debug,
1533d722a9Sopenharmony_ci    Default,
1633d722a9Sopenharmony_ci    Eq,
1733d722a9Sopenharmony_ci    ExternType,
1833d722a9Sopenharmony_ci    Hash,
1933d722a9Sopenharmony_ci    Ord,
2033d722a9Sopenharmony_ci    PartialEq,
2133d722a9Sopenharmony_ci    PartialOrd,
2233d722a9Sopenharmony_ci    Serialize,
2333d722a9Sopenharmony_ci    Deserialize,
2433d722a9Sopenharmony_ci}
2533d722a9Sopenharmony_ci
2633d722a9Sopenharmony_ciimpl Derive {
2733d722a9Sopenharmony_ci    pub fn from(ident: &Ident) -> Option<Self> {
2833d722a9Sopenharmony_ci        let what = match ident.to_string().as_str() {
2933d722a9Sopenharmony_ci            "Clone" => Trait::Clone,
3033d722a9Sopenharmony_ci            "Copy" => Trait::Copy,
3133d722a9Sopenharmony_ci            "Debug" => Trait::Debug,
3233d722a9Sopenharmony_ci            "Default" => Trait::Default,
3333d722a9Sopenharmony_ci            "Eq" => Trait::Eq,
3433d722a9Sopenharmony_ci            "ExternType" => Trait::ExternType,
3533d722a9Sopenharmony_ci            "Hash" => Trait::Hash,
3633d722a9Sopenharmony_ci            "Ord" => Trait::Ord,
3733d722a9Sopenharmony_ci            "PartialEq" => Trait::PartialEq,
3833d722a9Sopenharmony_ci            "PartialOrd" => Trait::PartialOrd,
3933d722a9Sopenharmony_ci            "Serialize" => Trait::Serialize,
4033d722a9Sopenharmony_ci            "Deserialize" => Trait::Deserialize,
4133d722a9Sopenharmony_ci            _ => return None,
4233d722a9Sopenharmony_ci        };
4333d722a9Sopenharmony_ci        let span = ident.span();
4433d722a9Sopenharmony_ci        Some(Derive { what, span })
4533d722a9Sopenharmony_ci    }
4633d722a9Sopenharmony_ci}
4733d722a9Sopenharmony_ci
4833d722a9Sopenharmony_ciimpl PartialEq<Trait> for Derive {
4933d722a9Sopenharmony_ci    fn eq(&self, other: &Trait) -> bool {
5033d722a9Sopenharmony_ci        self.what == *other
5133d722a9Sopenharmony_ci    }
5233d722a9Sopenharmony_ci}
5333d722a9Sopenharmony_ci
5433d722a9Sopenharmony_ciimpl AsRef<str> for Trait {
5533d722a9Sopenharmony_ci    fn as_ref(&self) -> &str {
5633d722a9Sopenharmony_ci        match self {
5733d722a9Sopenharmony_ci            Trait::Clone => "Clone",
5833d722a9Sopenharmony_ci            Trait::Copy => "Copy",
5933d722a9Sopenharmony_ci            Trait::Debug => "Debug",
6033d722a9Sopenharmony_ci            Trait::Default => "Default",
6133d722a9Sopenharmony_ci            Trait::Eq => "Eq",
6233d722a9Sopenharmony_ci            Trait::ExternType => "ExternType",
6333d722a9Sopenharmony_ci            Trait::Hash => "Hash",
6433d722a9Sopenharmony_ci            Trait::Ord => "Ord",
6533d722a9Sopenharmony_ci            Trait::PartialEq => "PartialEq",
6633d722a9Sopenharmony_ci            Trait::PartialOrd => "PartialOrd",
6733d722a9Sopenharmony_ci            Trait::Serialize => "Serialize",
6833d722a9Sopenharmony_ci            Trait::Deserialize => "Deserialize",
6933d722a9Sopenharmony_ci        }
7033d722a9Sopenharmony_ci    }
7133d722a9Sopenharmony_ci}
7233d722a9Sopenharmony_ci
7333d722a9Sopenharmony_ciimpl Display for Derive {
7433d722a9Sopenharmony_ci    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
7533d722a9Sopenharmony_ci        formatter.write_str(self.what.as_ref())
7633d722a9Sopenharmony_ci    }
7733d722a9Sopenharmony_ci}
7833d722a9Sopenharmony_ci
7933d722a9Sopenharmony_cipub fn contains(derives: &[Derive], query: Trait) -> bool {
8033d722a9Sopenharmony_ci    derives.iter().any(|derive| derive.what == query)
8133d722a9Sopenharmony_ci}
82