diff --git a/Cargo.toml b/Cargo.toml index 58dd44d..6dc0989 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,3 +4,4 @@ version = "0.1.0" edition = "2021" [dependencies] +serde = { version = "1.0.210", features = ["derive"] } diff --git a/src/enums/infix_token.rs b/src/enums/infix_token.rs index 9f97da3..16df5ad 100644 --- a/src/enums/infix_token.rs +++ b/src/enums/infix_token.rs @@ -1,7 +1,9 @@ use crate::enums::operator::Operator; use crate::Parenthesis; +use serde::{Deserialize, Serialize}; -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case", tag = "type")] pub enum InfixToken { Parenthesis(Parenthesis), Operator(Operator), diff --git a/src/enums/operator.rs b/src/enums/operator.rs index d55fa54..1b1206a 100644 --- a/src/enums/operator.rs +++ b/src/enums/operator.rs @@ -1,4 +1,7 @@ -#[derive(PartialEq, Copy, Clone, Debug)] +use serde::{Deserialize, Serialize}; + +#[derive(PartialEq, Copy, Clone, Debug, Serialize, Deserialize)] +#[serde(rename_all = "snake_case", tag = "value")] pub enum Operator { And, Or, diff --git a/src/enums/parenthesis.rs b/src/enums/parenthesis.rs index ee7ff5d..5da0e4c 100644 --- a/src/enums/parenthesis.rs +++ b/src/enums/parenthesis.rs @@ -1,4 +1,7 @@ -#[derive(Debug, PartialEq)] +use serde::{Deserialize, Serialize}; + +#[derive(PartialEq, Debug, Serialize, Deserialize)] +#[serde(rename_all = "snake_case", tag = "value")] pub enum Parenthesis { Open, Close, diff --git a/src/enums/postfix_token.rs b/src/enums/postfix_token.rs index d613dd2..d013e71 100644 --- a/src/enums/postfix_token.rs +++ b/src/enums/postfix_token.rs @@ -1,6 +1,8 @@ use crate::enums::operator::Operator; +use serde::{Deserialize, Serialize}; -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case", tag = "type")] pub enum PostfixToken { Operator(Operator), Predicate(Predicate), diff --git a/src/structs/infix_expression.rs b/src/structs/infix_expression.rs index 4370682..b9b38fe 100644 --- a/src/structs/infix_expression.rs +++ b/src/structs/infix_expression.rs @@ -1,8 +1,11 @@ use crate::internals::infix_stack_item::InfixStackItem; use crate::{InfixToken, Parenthesis, PostfixExpression, PostfixToken}; +use serde::{Deserialize, Serialize}; -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] pub struct InfixExpression { + #[serde(rename = "infix_tokens")] tokens: Vec>, } @@ -58,6 +61,10 @@ impl InfixExpression { Self { tokens } } + pub fn is_valid(&self) -> bool { + Self::are_tokens_valid(&self.tokens) + } + fn are_tokens_valid(tokens: &[InfixToken]) -> bool { let mut operator_stack: Vec = Vec::new(); let mut predicate_cnt: usize = 0; diff --git a/src/structs/postfix_expression.rs b/src/structs/postfix_expression.rs index 91b7c23..70ff4ae 100644 --- a/src/structs/postfix_expression.rs +++ b/src/structs/postfix_expression.rs @@ -2,10 +2,13 @@ use crate::enums::postfix_token::PostfixToken; use crate::internals::postfix_stack_item::PostfixStackItem; use crate::traits::predicate_evaluator::PredicateEvaluator; use crate::{InfixExpression, InfixToken, Operator, Parenthesis}; +use serde::{Deserialize, Serialize}; use std::collections::VecDeque; -#[derive(Debug, PartialEq)] +#[derive(Debug, PartialEq, Serialize, Deserialize)] +#[serde(rename_all = "snake_case")] pub struct PostfixExpression { + #[serde(rename = "postfix_tokens")] tokens: Vec>, } @@ -85,6 +88,10 @@ impl PostfixExpression { Self { tokens } } + pub fn is_valid(&self) -> bool { + Self::are_tokens_valid(&self.tokens) + } + fn are_tokens_valid(tokens: &[PostfixToken]) -> bool { let mut cnt: usize = 0;