plux_rs/variable/
var_type.rs

1use std::fmt::Display;
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Default, Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd)]
6pub enum VariableType {
7    #[default]
8    Let,
9    Int(VariableIntType),
10    Float(VariableFloatType),
11    Bool,
12    Char,
13    String,
14    List,
15}
16
17#[derive(Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd)]
18pub enum VariableIntType {
19    Signed(VariableSignedIntType),
20    Unsigned(VariableUnsignedIntType),
21}
22
23#[derive(Default, Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd)]
24pub enum VariableSignedIntType {
25    I8,
26    I16,
27    #[default]
28    I32,
29    I64,
30}
31
32#[derive(Default, Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd)]
33pub enum VariableUnsignedIntType {
34    U8,
35    U16,
36    #[default]
37    U32,
38    U64,
39}
40
41#[derive(Default, Clone, Copy, Debug, Serialize, Deserialize, PartialEq, Eq, PartialOrd)]
42pub enum VariableFloatType {
43    #[default]
44    F32,
45    F64,
46}
47
48impl VariableType {
49    pub const I8: VariableType =
50        VariableType::Int(VariableIntType::Signed(VariableSignedIntType::I8));
51    pub const I16: VariableType =
52        VariableType::Int(VariableIntType::Signed(VariableSignedIntType::I16));
53    pub const I32: VariableType =
54        VariableType::Int(VariableIntType::Signed(VariableSignedIntType::I32));
55    pub const I64: VariableType =
56        VariableType::Int(VariableIntType::Signed(VariableSignedIntType::I64));
57    pub const U8: VariableType =
58        VariableType::Int(VariableIntType::Unsigned(VariableUnsignedIntType::U8));
59    pub const U16: VariableType =
60        VariableType::Int(VariableIntType::Unsigned(VariableUnsignedIntType::U16));
61    pub const U32: VariableType =
62        VariableType::Int(VariableIntType::Unsigned(VariableUnsignedIntType::U32));
63    pub const U64: VariableType =
64        VariableType::Int(VariableIntType::Unsigned(VariableUnsignedIntType::U16));
65    pub const F32: VariableType = VariableType::Float(VariableFloatType::F32);
66    pub const F64: VariableType = VariableType::Float(VariableFloatType::F64);
67}
68
69impl Default for VariableIntType {
70    fn default() -> Self {
71        Self::Signed(Default::default())
72    }
73}
74
75impl Display for VariableType {
76    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
77        match self {
78            Self::Int(t) => write!(f, "{t}"),
79            Self::Float(t) => write!(f, "{t}"),
80            ty => write!(f, "{ty:?}"),
81        }
82    }
83}
84
85impl Display for VariableIntType {
86    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
87        match self {
88            Self::Signed(t) => write!(f, "{t}"),
89            Self::Unsigned(t) => write!(f, "{t}"),
90        }
91    }
92}
93
94impl Display for VariableFloatType {
95    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
96        write!(f, "{self:?}")
97    }
98}
99
100impl Display for VariableSignedIntType {
101    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
102        write!(f, "{self:?}")
103    }
104}
105
106impl Display for VariableUnsignedIntType {
107    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
108        write!(f, "{self:?}")
109    }
110}