rs_sb3/
value.rs

1//! Module to deal with Scratch value
2
3use 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}