| David Tolnay | ba5eb2d | 2020-03-06 09:58:20 -0800 | [diff] [blame] | 1 | use crate::syntax::Type; |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 2 | use proc_macro2::Ident; |
| David Tolnay | 699351b | 2020-05-10 22:57:08 -0700 | [diff] [blame] | 3 | use std::fmt::{self, Display}; |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 4 | |
| 5 | #[derive(Copy, Clone, PartialEq)] |
| 6 | pub enum Atom { |
| 7 | Bool, |
| David Tolnay | b3873dc | 2020-11-25 19:47:49 -0800 | [diff] [blame] | 8 | Char, // C char, not Rust char |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 9 | U8, |
| 10 | U16, |
| 11 | U32, |
| 12 | U64, |
| 13 | Usize, |
| 14 | I8, |
| 15 | I16, |
| 16 | I32, |
| 17 | I64, |
| 18 | Isize, |
| David Tolnay | 3383ae7 | 2020-03-13 01:12:26 -0700 | [diff] [blame] | 19 | F32, |
| 20 | F64, |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 21 | CxxString, |
| 22 | RustString, |
| 23 | } |
| 24 | |
| 25 | impl Atom { |
| 26 | pub fn from(ident: &Ident) -> Option<Self> { |
| David Tolnay | 9bcb4c6 | 2020-05-10 17:42:06 -0700 | [diff] [blame] | 27 | Self::from_str(ident.to_string().as_str()) |
| 28 | } |
| 29 | |
| 30 | pub fn from_str(s: &str) -> Option<Self> { |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 31 | use self::Atom::*; |
| David Tolnay | 9bcb4c6 | 2020-05-10 17:42:06 -0700 | [diff] [blame] | 32 | match s { |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 33 | "bool" => Some(Bool), |
| David Tolnay | b3873dc | 2020-11-25 19:47:49 -0800 | [diff] [blame] | 34 | "c_char" => Some(Char), |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 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), |
| David Tolnay | 9542f22 | 2020-03-13 13:55:28 -0700 | [diff] [blame] | 44 | "isize" => Some(Isize), |
| David Tolnay | 3383ae7 | 2020-03-13 01:12:26 -0700 | [diff] [blame] | 45 | "f32" => Some(F32), |
| 46 | "f64" => Some(F64), |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 47 | "CxxString" => Some(CxxString), |
| 48 | "String" => Some(RustString), |
| 49 | _ => None, |
| 50 | } |
| 51 | } |
| 52 | } |
| David Tolnay | ba5eb2d | 2020-03-06 09:58:20 -0800 | [diff] [blame] | 53 | |
| David Tolnay | 699351b | 2020-05-10 22:57:08 -0700 | [diff] [blame] | 54 | impl Display for Atom { |
| 55 | fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| 56 | formatter.write_str(self.as_ref()) |
| 57 | } |
| 58 | } |
| 59 | |
| David Tolnay | a4596c4 | 2020-05-10 22:55:45 -0700 | [diff] [blame] | 60 | impl AsRef<str> for Atom { |
| 61 | fn as_ref(&self) -> &str { |
| 62 | use self::Atom::*; |
| 63 | match self { |
| 64 | Bool => "bool", |
| David Tolnay | b3873dc | 2020-11-25 19:47:49 -0800 | [diff] [blame] | 65 | Char => "c_char", |
| David Tolnay | a4596c4 | 2020-05-10 22:55:45 -0700 | [diff] [blame] | 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 | } |
| David Tolnay | ba5eb2d | 2020-03-06 09:58:20 -0800 | [diff] [blame] | 81 | } |
| 82 | } |
| 83 | |
| 84 | impl PartialEq<Atom> for Type { |
| 85 | fn eq(&self, atom: &Atom) -> bool { |
| 86 | match self { |
| Adrian Taylor | c871343 | 2020-10-21 18:20:55 -0700 | [diff] [blame] | 87 | Type::Ident(ident) => ident.rust == atom, |
| David Tolnay | ba5eb2d | 2020-03-06 09:58:20 -0800 | [diff] [blame] | 88 | _ => false, |
| 89 | } |
| 90 | } |
| 91 | } |
| David Tolnay | 438e260 | 2020-03-06 10:21:35 -0800 | [diff] [blame] | 92 | |
| 93 | impl PartialEq<Atom> for &Ident { |
| 94 | fn eq(&self, atom: &Atom) -> bool { |
| 95 | *self == atom |
| 96 | } |
| 97 | } |
| 98 | |
| 99 | impl PartialEq<Atom> for &Type { |
| 100 | fn eq(&self, atom: &Atom) -> bool { |
| 101 | *self == atom |
| 102 | } |
| 103 | } |