cxx_gen/syntax/
atom.rs

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, // C char, not Rust char
9    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}