1use derive_more::From;
2use spacetimedb_sats::{AlgebraicValue, SpacetimeType, SumValue};
3
4#[derive(Debug, Clone, From, SpacetimeType)]
7#[sats(crate = spacetimedb_lib)]
8pub enum StVarValue {
9 Bool(bool),
10 I8(i8),
11 U8(u8),
12 I16(i16),
13 U16(u16),
14 I32(i32),
15 U32(u32),
16 I64(i64),
17 U64(u64),
18 I128(i128),
19 U128(u128),
20 F32(f32),
22 F64(f64),
23 String(Box<str>),
24}
25
26impl StVarValue {
27 pub fn try_from_primitive(value: AlgebraicValue) -> Result<Self, AlgebraicValue> {
28 match value {
29 AlgebraicValue::Bool(v) => Ok(StVarValue::Bool(v)),
30 AlgebraicValue::I8(v) => Ok(StVarValue::I8(v)),
31 AlgebraicValue::U8(v) => Ok(StVarValue::U8(v)),
32 AlgebraicValue::I16(v) => Ok(StVarValue::I16(v)),
33 AlgebraicValue::U16(v) => Ok(StVarValue::U16(v)),
34 AlgebraicValue::I32(v) => Ok(StVarValue::I32(v)),
35 AlgebraicValue::U32(v) => Ok(StVarValue::U32(v)),
36 AlgebraicValue::I64(v) => Ok(StVarValue::I64(v)),
37 AlgebraicValue::U64(v) => Ok(StVarValue::U64(v)),
38 AlgebraicValue::I128(v) => Ok(StVarValue::I128(v.0)),
39 AlgebraicValue::U128(v) => Ok(StVarValue::U128(v.0)),
40 AlgebraicValue::F32(v) => Ok(StVarValue::F32(v.into_inner())),
41 AlgebraicValue::F64(v) => Ok(StVarValue::F64(v.into_inner())),
42 AlgebraicValue::String(v) => Ok(StVarValue::String(v)),
43 _ => Err(value),
44 }
45 }
46
47 pub fn try_from_sum(value: AlgebraicValue) -> Result<Self, AlgebraicValue> {
48 value.into_sum()?.try_into()
49 }
50}
51
52impl TryFrom<SumValue> for StVarValue {
53 type Error = AlgebraicValue;
54
55 fn try_from(sum: SumValue) -> Result<Self, Self::Error> {
56 match sum.tag {
57 0 => Ok(StVarValue::Bool(sum.value.into_bool()?)),
58 1 => Ok(StVarValue::I8(sum.value.into_i8()?)),
59 2 => Ok(StVarValue::U8(sum.value.into_u8()?)),
60 3 => Ok(StVarValue::I16(sum.value.into_i16()?)),
61 4 => Ok(StVarValue::U16(sum.value.into_u16()?)),
62 5 => Ok(StVarValue::I32(sum.value.into_i32()?)),
63 6 => Ok(StVarValue::U32(sum.value.into_u32()?)),
64 7 => Ok(StVarValue::I64(sum.value.into_i64()?)),
65 8 => Ok(StVarValue::U64(sum.value.into_u64()?)),
66 9 => Ok(StVarValue::I128(sum.value.into_i128()?.0)),
67 10 => Ok(StVarValue::U128(sum.value.into_u128()?.0)),
68 11 => Ok(StVarValue::F32(sum.value.into_f32()?.into_inner())),
69 12 => Ok(StVarValue::F64(sum.value.into_f64()?.into_inner())),
70 13 => Ok(StVarValue::String(sum.value.into_string()?)),
71 _ => Err(*sum.value),
72 }
73 }
74}
75
76impl From<StVarValue> for AlgebraicValue {
77 fn from(value: StVarValue) -> Self {
78 AlgebraicValue::Sum(value.into())
79 }
80}
81
82impl From<StVarValue> for SumValue {
83 fn from(value: StVarValue) -> Self {
84 match value {
85 StVarValue::Bool(v) => SumValue {
86 tag: 0,
87 value: Box::new(AlgebraicValue::Bool(v)),
88 },
89 StVarValue::I8(v) => SumValue {
90 tag: 1,
91 value: Box::new(AlgebraicValue::I8(v)),
92 },
93 StVarValue::U8(v) => SumValue {
94 tag: 2,
95 value: Box::new(AlgebraicValue::U8(v)),
96 },
97 StVarValue::I16(v) => SumValue {
98 tag: 3,
99 value: Box::new(AlgebraicValue::I16(v)),
100 },
101 StVarValue::U16(v) => SumValue {
102 tag: 4,
103 value: Box::new(AlgebraicValue::U16(v)),
104 },
105 StVarValue::I32(v) => SumValue {
106 tag: 5,
107 value: Box::new(AlgebraicValue::I32(v)),
108 },
109 StVarValue::U32(v) => SumValue {
110 tag: 6,
111 value: Box::new(AlgebraicValue::U32(v)),
112 },
113 StVarValue::I64(v) => SumValue {
114 tag: 7,
115 value: Box::new(AlgebraicValue::I64(v)),
116 },
117 StVarValue::U64(v) => SumValue {
118 tag: 8,
119 value: Box::new(AlgebraicValue::U64(v)),
120 },
121 StVarValue::I128(v) => SumValue {
122 tag: 9,
123 value: Box::new(AlgebraicValue::I128(v.into())),
124 },
125 StVarValue::U128(v) => SumValue {
126 tag: 10,
127 value: Box::new(AlgebraicValue::U128(v.into())),
128 },
129 StVarValue::F32(v) => SumValue {
130 tag: 11,
131 value: Box::new(AlgebraicValue::F32(v.into())),
132 },
133 StVarValue::F64(v) => SumValue {
134 tag: 12,
135 value: Box::new(AlgebraicValue::F64(v.into())),
136 },
137 StVarValue::String(v) => SumValue {
138 tag: 13,
139 value: Box::new(AlgebraicValue::String(v)),
140 },
141 }
142 }
143}