1use crate::syntax::Type; 2use proc_macro2::Ident; 3use std::fmt::{self, Display}; 4 5#[derive(Copy, Clone, PartialEq)] 6pub 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 fn from(ident: &Ident) -> Option<Self> { 27 Self::from_str(ident.to_string().as_str()) 28 } 29 30 pub 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} 104