plux_rs/variable/
var_type.rs1use 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}