Skip to main content

datex_core/global/operators/
comparison.rs

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