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}