| 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, |
| 8 | U8, |
| 9 | U16, |
| 10 | U32, |
| 11 | U64, |
| 12 | Usize, |
| 13 | I8, |
| 14 | I16, |
| 15 | I32, |
| 16 | I64, |
| 17 | Isize, |
| David Tolnay | 3383ae7 | 2020-03-13 01:12:26 -0700 | [diff] [blame] | 18 | F32, |
| 19 | F64, |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 20 | CxxString, |
| 21 | RustString, |
| 22 | } |
| 23 | |
| 24 | impl Atom { |
| 25 | pub fn from(ident: &Ident) -> Option<Self> { |
| David Tolnay | 9bcb4c6 | 2020-05-10 17:42:06 -0700 | [diff] [blame] | 26 | Self::from_str(ident.to_string().as_str()) |
| 27 | } |
| 28 | |
| 29 | pub fn from_str(s: &str) -> Option<Self> { |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 30 | use self::Atom::*; |
| David Tolnay | 9bcb4c6 | 2020-05-10 17:42:06 -0700 | [diff] [blame] | 31 | match s { |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 32 | "bool" => Some(Bool), |
| 33 | "u8" => Some(U8), |
| 34 | "u16" => Some(U16), |
| 35 | "u32" => Some(U32), |
| 36 | "u64" => Some(U64), |
| 37 | "usize" => Some(Usize), |
| 38 | "i8" => Some(I8), |
| 39 | "i16" => Some(I16), |
| 40 | "i32" => Some(I32), |
| 41 | "i64" => Some(I64), |
| David Tolnay | 9542f22 | 2020-03-13 13:55:28 -0700 | [diff] [blame] | 42 | "isize" => Some(Isize), |
| David Tolnay | 3383ae7 | 2020-03-13 01:12:26 -0700 | [diff] [blame] | 43 | "f32" => Some(F32), |
| 44 | "f64" => Some(F64), |
| David Tolnay | 7db7369 | 2019-10-20 14:51:12 -0400 | [diff] [blame] | 45 | "CxxString" => Some(CxxString), |
| 46 | "String" => Some(RustString), |
| 47 | _ => None, |
| 48 | } |
| 49 | } |
| 50 | } |
| David Tolnay | ba5eb2d | 2020-03-06 09:58:20 -0800 | [diff] [blame] | 51 | |
| David Tolnay | 699351b | 2020-05-10 22:57:08 -0700 | [diff] [blame] | 52 | impl Display for Atom { |
| 53 | fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result { |
| 54 | formatter.write_str(self.as_ref()) |
| 55 | } |
| 56 | } |
| 57 | |
| David Tolnay | a4596c4 | 2020-05-10 22:55:45 -0700 | [diff] [blame] | 58 | impl AsRef<str> for Atom { |
| 59 | fn as_ref(&self) -> &str { |
| 60 | use self::Atom::*; |
| 61 | match self { |
| 62 | Bool => "bool", |
| 63 | U8 => "u8", |
| 64 | U16 => "u16", |
| 65 | U32 => "u32", |
| 66 | U64 => "u64", |
| 67 | Usize => "usize", |
| 68 | I8 => "i8", |
| 69 | I16 => "i16", |
| 70 | I32 => "i32", |
| 71 | I64 => "i64", |
| 72 | Isize => "isize", |
| 73 | F32 => "f32", |
| 74 | F64 => "f64", |
| 75 | CxxString => "CxxString", |
| 76 | RustString => "String", |
| 77 | } |
| David Tolnay | ba5eb2d | 2020-03-06 09:58:20 -0800 | [diff] [blame] | 78 | } |
| 79 | } |
| 80 | |
| 81 | impl PartialEq<Atom> for Type { |
| 82 | fn eq(&self, atom: &Atom) -> bool { |
| 83 | match self { |
| Adrian Taylor | c871343 | 2020-10-21 18:20:55 -0700 | [diff] [blame] | 84 | Type::Ident(ident) => ident.rust == atom, |
| David Tolnay | ba5eb2d | 2020-03-06 09:58:20 -0800 | [diff] [blame] | 85 | _ => false, |
| 86 | } |
| 87 | } |
| 88 | } |
| David Tolnay | 438e260 | 2020-03-06 10:21:35 -0800 | [diff] [blame] | 89 | |
| 90 | impl PartialEq<Atom> for &Ident { |
| 91 | fn eq(&self, atom: &Atom) -> bool { |
| 92 | *self == atom |
| 93 | } |
| 94 | } |
| 95 | |
| 96 | impl PartialEq<Atom> for &Type { |
| 97 | fn eq(&self, atom: &Atom) -> bool { |
| 98 | *self == atom |
| 99 | } |
| 100 | } |