wfrs-model 0.20.2

Workflow RS - Model with Zero-copy deserialization
Documentation
use rkyv::{Archive, Deserialize, Serialize};
use std::{str::FromStr, sync::Arc};

use crate::json::JsonValue;

#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
#[archive(compare(PartialEq))]
#[archive_attr(derive(Debug))]
pub enum Operator {
    Equal,
    NotEqual,
    Greater,
    GreaterOrEqual,
    Lower,
    LowerOrEqual,
    And,
    Or,
}

impl FromStr for Operator {
    type Err = String;
    fn from_str(s: &str) -> Result<Self, Self::Err> {
        match s {
            "==" => Ok(Operator::Equal),
            "!=" => Ok(Operator::NotEqual),
            ">" => Ok(Operator::Greater),
            ">=" => Ok(Operator::GreaterOrEqual),
            "<" => Ok(Operator::Lower),
            "<=" => Ok(Operator::LowerOrEqual),
            "&&" => Ok(Operator::And),
            "||" => Ok(Operator::Or),
            _ => Err(format!("Invalid operator '{s}'")),
        }
    }
}

#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
#[archive(
    bound(
        serialize = "__S: rkyv::ser::ScratchSpace + rkyv::ser::SharedSerializeRegistry + rkyv::ser::Serializer",
        deserialize = "__D: rkyv::de::SharedDeserializeRegistry"
    ),
    compare(PartialEq)
)]
#[archive_attr(derive(Debug))]
pub struct BinaryExpression {
    pub operator: Operator,
    #[omit_bounds]
    pub left: Box<JsepNode>,
    #[omit_bounds]
    pub right: Box<JsepNode>,
}

#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
#[archive(compare(PartialEq))]
#[archive_attr(derive(Debug))]
pub struct ExpressionIdentifier {
    pub name: Arc<str>,
}

#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
#[archive(compare(PartialEq))]
#[archive_attr(derive(Debug))]
pub struct ExpressionLiteral {
    pub value: JsonValue,
}

#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
#[archive(
    bound(
        serialize = "__S: rkyv::ser::ScratchSpace + rkyv::ser::SharedSerializeRegistry + rkyv::ser::Serializer",
        deserialize = "__D: rkyv::de::SharedDeserializeRegistry"
    ),
    compare(PartialEq)
)]
#[archive_attr(derive(Debug))]
pub struct ConditionalExpression {
    #[omit_bounds]
    pub test: Box<JsepNode>,
    #[omit_bounds]
    pub consequent: Box<JsepNode>,
    #[omit_bounds]
    pub alternate: Box<JsepNode>,
}

#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
#[archive(
    bound(
        serialize = "__S: rkyv::ser::ScratchSpace + rkyv::ser::SharedSerializeRegistry + rkyv::ser::Serializer",
        deserialize = "__D: rkyv::de::SharedDeserializeRegistry"
    ),
    compare(PartialEq)
)]
#[archive_attr(derive(Debug))]
pub struct MemberExpression {
    pub computed: bool,
    pub optional: bool,
    #[omit_bounds]
    pub object: Box<JsepNode>,
    #[omit_bounds]
    pub property: Box<JsepNode>,
}

#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)]
#[archive(
    bound(
        serialize = "__S: rkyv::ser::ScratchSpace + rkyv::ser::SharedSerializeRegistry + rkyv::ser::Serializer",
        deserialize = "__D: rkyv::de::SharedDeserializeRegistry"
    ),
    compare(PartialEq)
)]
#[archive_attr(derive(Debug))]
pub enum JsepNode {
    ConditionalExpression(ConditionalExpression),
    BinaryExpression(BinaryExpression),
    Identifier(ExpressionIdentifier),
    Literal(ExpressionLiteral),
    MemberExpression(MemberExpression),
}