Skip to main content

tree_table/types/
val.rs

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 = "tsify", tsify(from_wasm_abi))]
10#[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
71// Strings and characters
72impl 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
88// Unsigned integers
89impl 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
115// Signed integers
116impl 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
142// Other Numbers
143impl 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
164// Boolean
165impl From<bool> for Val {
166    fn from(val: bool) -> Self {
167        Val::Bl(val)
168    }
169}
170
171// deep-time
172impl From<Dt> for Val {
173    fn from(val: Dt) -> Self {
174        Val::Dt(val)
175    }
176}
177
178// Option
179impl<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}