133d722a9Sopenharmony_ciuse crate::syntax::Type;
233d722a9Sopenharmony_ciuse proc_macro2::Ident;
333d722a9Sopenharmony_ciuse std::fmt::{self, Display};
433d722a9Sopenharmony_ci
533d722a9Sopenharmony_ci#[derive(Copy, Clone, PartialEq)]
633d722a9Sopenharmony_cipub enum Atom {
733d722a9Sopenharmony_ci    Bool,
833d722a9Sopenharmony_ci    Char, // C char, not Rust char
933d722a9Sopenharmony_ci    U8,
1033d722a9Sopenharmony_ci    U16,
1133d722a9Sopenharmony_ci    U32,
1233d722a9Sopenharmony_ci    U64,
1333d722a9Sopenharmony_ci    Usize,
1433d722a9Sopenharmony_ci    I8,
1533d722a9Sopenharmony_ci    I16,
1633d722a9Sopenharmony_ci    I32,
1733d722a9Sopenharmony_ci    I64,
1833d722a9Sopenharmony_ci    Isize,
1933d722a9Sopenharmony_ci    F32,
2033d722a9Sopenharmony_ci    F64,
2133d722a9Sopenharmony_ci    CxxString,
2233d722a9Sopenharmony_ci    RustString,
2333d722a9Sopenharmony_ci}
2433d722a9Sopenharmony_ci
2533d722a9Sopenharmony_ciimpl Atom {
2633d722a9Sopenharmony_ci    pub fn from(ident: &Ident) -> Option<Self> {
2733d722a9Sopenharmony_ci        Self::from_str(ident.to_string().as_str())
2833d722a9Sopenharmony_ci    }
2933d722a9Sopenharmony_ci
3033d722a9Sopenharmony_ci    pub fn from_str(s: &str) -> Option<Self> {
3133d722a9Sopenharmony_ci        use self::Atom::*;
3233d722a9Sopenharmony_ci        match s {
3333d722a9Sopenharmony_ci            "bool" => Some(Bool),
3433d722a9Sopenharmony_ci            "c_char" => Some(Char),
3533d722a9Sopenharmony_ci            "u8" => Some(U8),
3633d722a9Sopenharmony_ci            "u16" => Some(U16),
3733d722a9Sopenharmony_ci            "u32" => Some(U32),
3833d722a9Sopenharmony_ci            "u64" => Some(U64),
3933d722a9Sopenharmony_ci            "usize" => Some(Usize),
4033d722a9Sopenharmony_ci            "i8" => Some(I8),
4133d722a9Sopenharmony_ci            "i16" => Some(I16),
4233d722a9Sopenharmony_ci            "i32" => Some(I32),
4333d722a9Sopenharmony_ci            "i64" => Some(I64),
4433d722a9Sopenharmony_ci            "isize" => Some(Isize),
4533d722a9Sopenharmony_ci            "f32" => Some(F32),
4633d722a9Sopenharmony_ci            "f64" => Some(F64),
4733d722a9Sopenharmony_ci            "CxxString" => Some(CxxString),
4833d722a9Sopenharmony_ci            "String" => Some(RustString),
4933d722a9Sopenharmony_ci            _ => None,
5033d722a9Sopenharmony_ci        }
5133d722a9Sopenharmony_ci    }
5233d722a9Sopenharmony_ci}
5333d722a9Sopenharmony_ci
5433d722a9Sopenharmony_ciimpl Display for Atom {
5533d722a9Sopenharmony_ci    fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
5633d722a9Sopenharmony_ci        formatter.write_str(self.as_ref())
5733d722a9Sopenharmony_ci    }
5833d722a9Sopenharmony_ci}
5933d722a9Sopenharmony_ci
6033d722a9Sopenharmony_ciimpl AsRef<str> for Atom {
6133d722a9Sopenharmony_ci    fn as_ref(&self) -> &str {
6233d722a9Sopenharmony_ci        use self::Atom::*;
6333d722a9Sopenharmony_ci        match self {
6433d722a9Sopenharmony_ci            Bool => "bool",
6533d722a9Sopenharmony_ci            Char => "c_char",
6633d722a9Sopenharmony_ci            U8 => "u8",
6733d722a9Sopenharmony_ci            U16 => "u16",
6833d722a9Sopenharmony_ci            U32 => "u32",
6933d722a9Sopenharmony_ci            U64 => "u64",
7033d722a9Sopenharmony_ci            Usize => "usize",
7133d722a9Sopenharmony_ci            I8 => "i8",
7233d722a9Sopenharmony_ci            I16 => "i16",
7333d722a9Sopenharmony_ci            I32 => "i32",
7433d722a9Sopenharmony_ci            I64 => "i64",
7533d722a9Sopenharmony_ci            Isize => "isize",
7633d722a9Sopenharmony_ci            F32 => "f32",
7733d722a9Sopenharmony_ci            F64 => "f64",
7833d722a9Sopenharmony_ci            CxxString => "CxxString",
7933d722a9Sopenharmony_ci            RustString => "String",
8033d722a9Sopenharmony_ci        }
8133d722a9Sopenharmony_ci    }
8233d722a9Sopenharmony_ci}
8333d722a9Sopenharmony_ci
8433d722a9Sopenharmony_ciimpl PartialEq<Atom> for Type {
8533d722a9Sopenharmony_ci    fn eq(&self, atom: &Atom) -> bool {
8633d722a9Sopenharmony_ci        match self {
8733d722a9Sopenharmony_ci            Type::Ident(ident) => ident.rust == atom,
8833d722a9Sopenharmony_ci            _ => false,
8933d722a9Sopenharmony_ci        }
9033d722a9Sopenharmony_ci    }
9133d722a9Sopenharmony_ci}
9233d722a9Sopenharmony_ci
9333d722a9Sopenharmony_ciimpl PartialEq<Atom> for &Ident {
9433d722a9Sopenharmony_ci    fn eq(&self, atom: &Atom) -> bool {
9533d722a9Sopenharmony_ci        *self == atom
9633d722a9Sopenharmony_ci    }
9733d722a9Sopenharmony_ci}
9833d722a9Sopenharmony_ci
9933d722a9Sopenharmony_ciimpl PartialEq<Atom> for &Type {
10033d722a9Sopenharmony_ci    fn eq(&self, atom: &Atom) -> bool {
10133d722a9Sopenharmony_ci        *self == atom
10233d722a9Sopenharmony_ci    }
10333d722a9Sopenharmony_ci}
104