1use crate::prelude::*;
4
5pub type Int = i64;
6pub type Float = f64;
7pub type Text = String;
8pub type Uid = String;
9pub type Name = String;
10pub type OpCode = String;
11
12#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
13#[serde(untagged)]
14pub enum Number {
15 Int(Int),
16 Float(Float),
17}
18
19#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
20#[serde(untagged)]
21pub enum Value {
22 Number(Number),
23 Text(Text),
24}
25
26#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
27#[serde(untagged)]
28pub enum ValueWithBool {
29 Number(Number),
30 Text(Text),
31 Bool(bool),
32}
33
34macro_rules! enum_from {
35 ($enum:ident {$($ty:ident)*}) => {
36 $(
37 impl From<$ty> for $enum {
38 fn from(v: $ty) -> Self {
39 $enum::$ty(v)
40 }
41 }
42 )*
43 }
44}
45
46enum_from! {
47 Number {
48 Int Float
49 }
50}
51
52enum_from! {
53 Value {
54 Number Text
55 }
56}
57
58impl From<Int> for Value {
59 fn from(v: Int) -> Self {
60 Value::Number(Number::Int(v))
61 }
62}
63
64impl From<Float> for Value {
65 fn from(v: Float) -> Self {
66 Value::Number(Number::Float(v))
67 }
68}
69
70impl From<Value> for ValueWithBool {
71 fn from(v: Value) -> Self {
72 match v {
73 Value::Number(n) => ValueWithBool::Number(n),
74 Value::Text(t) => ValueWithBool::Text(t),
75 }
76 }
77}
78
79impl Default for Number {
80 fn default() -> Self {
81 Number::Int(0)
82 }
83}
84
85impl Default for Value {
86 fn default() -> Self {
87 Value::Number(Default::default())
88 }
89}
90
91impl Default for ValueWithBool {
92 fn default() -> Self {
93 ValueWithBool::Number(Default::default())
94 }
95}