wfrs_model/
jsep.rs

1use rkyv::{Archive, Deserialize, Serialize};
2use std::{str::FromStr, sync::Arc};
3
4use crate::json::JsonValue;
5
6#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
7#[archive(compare(PartialEq))]
8#[archive_attr(derive(Debug))]
9pub enum Operator {
10    Equal,
11    NotEqual,
12    Greater,
13    GreaterOrEqual,
14    Lower,
15    LowerOrEqual,
16    And,
17    Or,
18}
19
20impl FromStr for Operator {
21    type Err = String;
22    fn from_str(s: &str) -> Result<Self, Self::Err> {
23        match s {
24            "==" => Ok(Operator::Equal),
25            "!=" => Ok(Operator::NotEqual),
26            ">" => Ok(Operator::Greater),
27            ">=" => Ok(Operator::GreaterOrEqual),
28            "<" => Ok(Operator::Lower),
29            "<=" => Ok(Operator::LowerOrEqual),
30            "&&" => Ok(Operator::And),
31            "||" => Ok(Operator::Or),
32            _ => Err(format!("Invalid operator '{s}'")),
33        }
34    }
35}
36
37#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
38#[archive(
39    bound(
40        serialize = "__S: rkyv::ser::ScratchSpace + rkyv::ser::SharedSerializeRegistry + rkyv::ser::Serializer",
41        deserialize = "__D: rkyv::de::SharedDeserializeRegistry"
42    ),
43    compare(PartialEq)
44)]
45#[archive_attr(derive(Debug))]
46pub struct BinaryExpression {
47    pub operator: Operator,
48    #[omit_bounds]
49    pub left: Box<JsepNode>,
50    #[omit_bounds]
51    pub right: Box<JsepNode>,
52}
53
54#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
55#[archive(compare(PartialEq))]
56#[archive_attr(derive(Debug))]
57pub struct ExpressionIdentifier {
58    pub name: Arc<str>,
59}
60
61#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
62#[archive(compare(PartialEq))]
63#[archive_attr(derive(Debug))]
64pub struct ExpressionLiteral {
65    pub value: JsonValue,
66}
67
68#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
69#[archive(
70    bound(
71        serialize = "__S: rkyv::ser::ScratchSpace + rkyv::ser::SharedSerializeRegistry + rkyv::ser::Serializer",
72        deserialize = "__D: rkyv::de::SharedDeserializeRegistry"
73    ),
74    compare(PartialEq)
75)]
76#[archive_attr(derive(Debug))]
77pub struct ConditionalExpression {
78    #[omit_bounds]
79    pub test: Box<JsepNode>,
80    #[omit_bounds]
81    pub consequent: Box<JsepNode>,
82    #[omit_bounds]
83    pub alternate: Box<JsepNode>,
84}
85
86#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
87#[archive(
88    bound(
89        serialize = "__S: rkyv::ser::ScratchSpace + rkyv::ser::SharedSerializeRegistry + rkyv::ser::Serializer",
90        deserialize = "__D: rkyv::de::SharedDeserializeRegistry"
91    ),
92    compare(PartialEq)
93)]
94#[archive_attr(derive(Debug))]
95pub struct MemberExpression {
96    pub computed: bool,
97    pub optional: bool,
98    #[omit_bounds]
99    pub object: Box<JsepNode>,
100    #[omit_bounds]
101    pub property: Box<JsepNode>,
102}
103
104#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
105#[archive(
106    bound(
107        serialize = "__S: rkyv::ser::ScratchSpace + rkyv::ser::SharedSerializeRegistry + rkyv::ser::Serializer",
108        deserialize = "__D: rkyv::de::SharedDeserializeRegistry"
109    ),
110    compare(PartialEq)
111)]
112#[archive_attr(derive(Debug))]
113pub enum JsepNode {
114    ConditionalExpression(ConditionalExpression),
115    BinaryExpression(BinaryExpression),
116    Identifier(ExpressionIdentifier),
117    Literal(ExpressionLiteral),
118    MemberExpression(MemberExpression),
119}