1use alloc::string::{String, ToString};
2use bigdecimal::BigDecimal;
3use bigdecimal::num_bigint::BigInt;
4use core::fmt;
5use deep_time::Dt;
6use rust_decimal::Decimal;
7
8#[cfg_attr(feature = "tsify", derive(tsify::Tsify))]
9#[cfg_attr(feature = "serde", serde(untagged))]
11#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
12#[derive(PartialEq, Clone, Debug)]
13pub enum Val {
14 Str(String),
15 Chr(char),
16 Un8(u8),
17 Un16(u16),
18 Un32(u32),
19 Un64(u64),
20 Un128(u128),
21 Sn8(i8),
22 Sn16(i16),
23 Sn32(i32),
24 Sn64(i64),
25 Sn128(i128),
26 Dec(Decimal),
27 Bigdec(BigDecimal),
28 Bigint(BigInt),
29 Fl64(f64),
30 Bl(bool),
31 Nil(()),
32 Undf(()),
33 Dt(Dt),
34 Dur(Dt),
35}
36
37impl Default for Val {
38 fn default() -> Self {
39 Val::Nil(())
40 }
41}
42
43impl fmt::Display for Val {
44 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
45 match self {
46 Val::Str(s) => write!(f, "{}", s),
47 Val::Chr(c) => write!(f, "{}", c),
48 Val::Un8(v) => write!(f, "{}", v),
49 Val::Un16(v) => write!(f, "{}", v),
50 Val::Un32(v) => write!(f, "{}", v),
51 Val::Un64(v) => write!(f, "{}", v),
52 Val::Un128(v) => write!(f, "{}", v),
53 Val::Sn8(v) => write!(f, "{}", v),
54 Val::Sn16(v) => write!(f, "{}", v),
55 Val::Sn32(v) => write!(f, "{}", v),
56 Val::Sn64(v) => write!(f, "{}", v),
57 Val::Sn128(v) => write!(f, "{}", v),
58 Val::Dec(v) => write!(f, "{}", v),
59 Val::Bigdec(v) => write!(f, "{}", v),
60 Val::Bigint(v) => write!(f, "{}", v),
61 Val::Fl64(v) => write!(f, "{}", v),
62 Val::Bl(b) => write!(f, "{}", b),
63 Val::Nil(_) => write!(f, "null"),
64 Val::Undf(_) => write!(f, "undefined"),
65 Val::Dt(v) => write!(f, "{}", v),
66 Val::Dur(v) => write!(f, "{}", v),
67 }
68 }
69}
70
71impl From<String> for Val {
73 fn from(val: String) -> Self {
74 Val::Str(val)
75 }
76}
77impl From<&str> for Val {
78 fn from(val: &str) -> Self {
79 Val::Str(val.to_string())
80 }
81}
82impl From<char> for Val {
83 fn from(val: char) -> Self {
84 Val::Chr(val)
85 }
86}
87
88impl From<u8> for Val {
90 fn from(val: u8) -> Self {
91 Val::Un8(val)
92 }
93}
94impl From<u16> for Val {
95 fn from(val: u16) -> Self {
96 Val::Un16(val)
97 }
98}
99impl From<u32> for Val {
100 fn from(val: u32) -> Self {
101 Val::Un32(val)
102 }
103}
104impl From<u64> for Val {
105 fn from(val: u64) -> Self {
106 Val::Un64(val)
107 }
108}
109impl From<u128> for Val {
110 fn from(val: u128) -> Self {
111 Val::Un128(val)
112 }
113}
114
115impl From<i8> for Val {
117 fn from(val: i8) -> Self {
118 Val::Sn8(val)
119 }
120}
121impl From<i16> for Val {
122 fn from(val: i16) -> Self {
123 Val::Sn16(val)
124 }
125}
126impl From<i32> for Val {
127 fn from(val: i32) -> Self {
128 Val::Sn32(val)
129 }
130}
131impl From<i64> for Val {
132 fn from(val: i64) -> Self {
133 Val::Sn64(val)
134 }
135}
136impl From<i128> for Val {
137 fn from(val: i128) -> Self {
138 Val::Sn128(val)
139 }
140}
141
142impl From<Decimal> for Val {
144 fn from(val: Decimal) -> Self {
145 Val::Dec(val)
146 }
147}
148impl From<BigDecimal> for Val {
149 fn from(val: BigDecimal) -> Self {
150 Val::Bigdec(val)
151 }
152}
153impl From<BigInt> for Val {
154 fn from(val: BigInt) -> Self {
155 Val::Bigint(val)
156 }
157}
158impl From<f64> for Val {
159 fn from(val: f64) -> Self {
160 Val::Fl64(val)
161 }
162}
163
164impl From<bool> for Val {
166 fn from(val: bool) -> Self {
167 Val::Bl(val)
168 }
169}
170
171impl From<Dt> for Val {
173 fn from(val: Dt) -> Self {
174 Val::Dt(val)
175 }
176}
177
178impl<T> From<Option<T>> for Val
180where
181 T: Into<Val>,
182{
183 fn from(opt: Option<T>) -> Self {
184 match opt {
185 Some(val) => val.into(),
186 None => Val::Nil(()),
187 }
188 }
189}