spacetimedb_lib/
st_var.rs

1use derive_more::From;
2use spacetimedb_sats::{AlgebraicValue, SpacetimeType, SumValue};
3
4/// The value of a system variable in `st_var`.
5/// Defined here because it is used in both the datastore and query.
6#[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    // No support for u/i256 added here as it seems unlikely to be useful.
21    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}