1use crate::syntax::Type;
2use proc_macro2::Ident;
3use std::fmt::{self, Display};
4
5#[derive(Copy, Clone, PartialEq)]
6pub(crate) enum Atom {
7 Bool,
8 Char, U8,
10 U16,
11 U32,
12 U64,
13 Usize,
14 I8,
15 I16,
16 I32,
17 I64,
18 Isize,
19 F32,
20 F64,
21 CxxString,
22 RustString,
23}
24
25impl Atom {
26 pub(crate) fn from(ident: &Ident) -> Option<Self> {
27 Self::from_str(ident.to_string().as_str())
28 }
29
30 pub(crate) fn from_str(s: &str) -> Option<Self> {
31 use self::Atom::*;
32 match s {
33 "bool" => Some(Bool),
34 "c_char" => Some(Char),
35 "u8" => Some(U8),
36 "u16" => Some(U16),
37 "u32" => Some(U32),
38 "u64" => Some(U64),
39 "usize" => Some(Usize),
40 "i8" => Some(I8),
41 "i16" => Some(I16),
42 "i32" => Some(I32),
43 "i64" => Some(I64),
44 "isize" => Some(Isize),
45 "f32" => Some(F32),
46 "f64" => Some(F64),
47 "CxxString" => Some(CxxString),
48 "String" => Some(RustString),
49 _ => None,
50 }
51 }
52}
53
54impl Display for Atom {
55 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
56 formatter.write_str(self.as_ref())
57 }
58}
59
60impl AsRef<str> for Atom {
61 fn as_ref(&self) -> &str {
62 use self::Atom::*;
63 match self {
64 Bool => "bool",
65 Char => "c_char",
66 U8 => "u8",
67 U16 => "u16",
68 U32 => "u32",
69 U64 => "u64",
70 Usize => "usize",
71 I8 => "i8",
72 I16 => "i16",
73 I32 => "i32",
74 I64 => "i64",
75 Isize => "isize",
76 F32 => "f32",
77 F64 => "f64",
78 CxxString => "CxxString",
79 RustString => "String",
80 }
81 }
82}
83
84impl PartialEq<Atom> for Type {
85 fn eq(&self, atom: &Atom) -> bool {
86 match self {
87 Type::Ident(ident) => ident.rust == atom,
88 _ => false,
89 }
90 }
91}
92
93impl PartialEq<Atom> for &Ident {
94 fn eq(&self, atom: &Atom) -> bool {
95 *self == atom
96 }
97}
98
99impl PartialEq<Atom> for &Type {
100 fn eq(&self, atom: &Atom) -> bool {
101 *self == atom
102 }
103}