datex_core/global/operators/
comparison.rs

1use crate::global::instruction_codes::InstructionCode;
2use crate::global::protocol_structures::instructions::RegularInstruction;
3use core::fmt::Display;
4use core::prelude::rust_2024::*;
5
6#[derive(Clone, Debug, PartialEq, Copy)]
7pub enum ComparisonOperator {
8    Is,                 // is
9    Matches,            // matches FIXME remove from here
10    StructuralEqual,    // ==
11    NotStructuralEqual, // !=
12    Equal,              // ===
13    NotEqual,           // !==
14    LessThan,           // <
15    GreaterThan,        // >
16    LessThanOrEqual,    // <=
17    GreaterThanOrEqual, // >=
18}
19
20impl Display for ComparisonOperator {
21    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
22        core::write!(
23            f,
24            "{}",
25            match self {
26                ComparisonOperator::Is => "is",
27                ComparisonOperator::Matches => "matches",
28                ComparisonOperator::StructuralEqual => "==",
29                ComparisonOperator::NotStructuralEqual => "!=",
30                ComparisonOperator::Equal => "===",
31                ComparisonOperator::NotEqual => "!==",
32                ComparisonOperator::LessThan => "<",
33                ComparisonOperator::GreaterThan => ">",
34                ComparisonOperator::LessThanOrEqual => "<=",
35                ComparisonOperator::GreaterThanOrEqual => ">=",
36            }
37        )
38    }
39}
40
41impl From<&ComparisonOperator> for InstructionCode {
42    fn from(op: &ComparisonOperator) -> Self {
43        match op {
44            ComparisonOperator::StructuralEqual => {
45                InstructionCode::STRUCTURAL_EQUAL
46            }
47            ComparisonOperator::NotStructuralEqual => {
48                InstructionCode::NOT_STRUCTURAL_EQUAL
49            }
50            ComparisonOperator::Equal => InstructionCode::EQUAL,
51            ComparisonOperator::NotEqual => InstructionCode::NOT_EQUAL,
52            ComparisonOperator::Is => InstructionCode::IS,
53            ComparisonOperator::Matches => InstructionCode::MATCHES,
54            operator => core::todo!(
55                "Comparison operator {:?} not implemented for InstructionCode",
56                operator
57            ),
58        }
59    }
60}
61
62impl From<ComparisonOperator> for InstructionCode {
63    fn from(op: ComparisonOperator) -> Self {
64        InstructionCode::from(&op)
65    }
66}
67impl From<&RegularInstruction> for ComparisonOperator {
68    fn from(instruction: &RegularInstruction) -> Self {
69        match instruction {
70            RegularInstruction::StructuralEqual => {
71                ComparisonOperator::StructuralEqual
72            }
73            RegularInstruction::Equal => ComparisonOperator::Equal,
74            RegularInstruction::NotStructuralEqual => {
75                ComparisonOperator::NotStructuralEqual
76            }
77            RegularInstruction::NotEqual => ComparisonOperator::NotEqual,
78            RegularInstruction::Is => ComparisonOperator::Is,
79            RegularInstruction::Matches => ComparisonOperator::Matches,
80            _ => {
81                core::todo!(
82                    "Comparison operator for instruction {:?} not implemented",
83                    instruction
84                );
85            }
86        }
87    }
88}
89
90impl From<RegularInstruction> for ComparisonOperator {
91    fn from(instruction: RegularInstruction) -> Self {
92        ComparisonOperator::from(&instruction)
93    }
94}