mlang_rs/rt/
opcode.rs

1/// The path used by [`Variable`] is used to point to [`Target`].
2#[derive(Debug, PartialEq, PartialOrd, Clone)]
3#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
4pub enum Path {
5    /// Reference by name.
6    Named(String),
7    /// Reference by optimized position.
8    Index(usize),
9}
10
11impl From<String> for Path {
12    fn from(value: String) -> Self {
13        Self::Named(value)
14    }
15}
16
17impl From<&str> for Path {
18    fn from(value: &str) -> Self {
19        Self::Named(value.to_owned())
20    }
21}
22
23impl From<usize> for Path {
24    fn from(value: usize) -> Self {
25        Self::Index(value)
26    }
27}
28
29/// The type of variable pointed to by [`Path`].
30#[derive(Debug, PartialEq, PartialOrd, Clone, Copy)]
31#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
32#[repr(u8)]
33pub enum Target {
34    /// Target is animation register.
35    Register,
36    /// Target is `item` variable returns by `foreach` iterator.
37    ForeachItem,
38    /// Target is `index` variable returns by `foreach` iterator.
39    ForeachIndex,
40    /// Target is `index` variable returns by `for range` iterator.
41    Range,
42}
43
44/// Variable used by property fields.
45#[derive(Debug, PartialEq, PartialOrd, Clone)]
46#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
47pub enum Variable<T> {
48    /// A literal constant value.
49    Constant(T),
50
51    Reference {
52        path: Path,
53        target: Target,
54    },
55}
56
57impl<T> From<T> for Variable<T> {
58    fn from(value: T) -> Self {
59        Self::Constant(value)
60    }
61}
62
63impl<T> Default for Variable<T>
64where
65    T: Default,
66{
67    fn default() -> Self {
68        Self::Constant(T::default())
69    }
70}