Skip to main content

datex_core/global/operators/
assignment.rs

1use super::super::instruction_codes::InstructionCode;
2use crate::global::protocol_structures::instructions::RegularInstruction;
3use core::{fmt::Display, prelude::rust_2024::*};
4
5#[derive(Clone, Debug, PartialEq, Copy)]
6pub enum AssignmentOperator {
7    Assign,           // =
8    AddAssign,        // +=
9    SubtractAssign,   // -=
10    MultiplyAssign,   // *=
11    DivideAssign,     // /=
12    ModuloAssign,     // %=
13    PowerAssign,      // ^=
14    BitwiseAndAssign, // &=
15    BitwiseOrAssign,  // |=
16}
17impl Display for AssignmentOperator {
18    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
19        core::write!(
20            f,
21            "{}",
22            match self {
23                AssignmentOperator::Assign => "=",
24                AssignmentOperator::AddAssign => "+=",
25                AssignmentOperator::SubtractAssign => "-=",
26                AssignmentOperator::MultiplyAssign => "*=",
27                AssignmentOperator::DivideAssign => "/=",
28                AssignmentOperator::ModuloAssign => "%=",
29                AssignmentOperator::PowerAssign => "^=",
30                AssignmentOperator::BitwiseAndAssign => "&=",
31                AssignmentOperator::BitwiseOrAssign => "|=",
32            }
33        )
34    }
35}
36
37impl From<&AssignmentOperator> for InstructionCode {
38    fn from(op: &AssignmentOperator) -> Self {
39        match op {
40            AssignmentOperator::Assign => InstructionCode::ASSIGN,
41            AssignmentOperator::AddAssign => InstructionCode::ADD_ASSIGN,
42            AssignmentOperator::SubtractAssign => {
43                InstructionCode::SUBTRACT_ASSIGN
44            }
45            AssignmentOperator::MultiplyAssign => {
46                InstructionCode::MULTIPLY_ASSIGN
47            }
48            AssignmentOperator::DivideAssign => InstructionCode::DIVIDE_ASSIGN,
49            operator => core::todo!(
50                "Assignment operator {:?} not implemented for InstructionCode",
51                operator
52            ),
53        }
54    }
55}
56
57impl TryFrom<InstructionCode> for AssignmentOperator {
58    type Error = ();
59    fn try_from(code: InstructionCode) -> Result<Self, Self::Error> {
60        Ok(match code {
61            InstructionCode::ASSIGN => AssignmentOperator::Assign,
62            InstructionCode::ADD_ASSIGN => AssignmentOperator::AddAssign,
63            InstructionCode::SUBTRACT_ASSIGN => {
64                AssignmentOperator::SubtractAssign
65            }
66            InstructionCode::MULTIPLY_ASSIGN => {
67                AssignmentOperator::MultiplyAssign
68            }
69            InstructionCode::DIVIDE_ASSIGN => AssignmentOperator::DivideAssign,
70            _ => return Err(()),
71        })
72    }
73}
74
75impl From<RegularInstruction> for AssignmentOperator {
76    fn from(instruction: RegularInstruction) -> Self {
77        match instruction {
78            RegularInstruction::AddAssign(_) => AssignmentOperator::AddAssign,
79            RegularInstruction::SubtractAssign(_) => {
80                AssignmentOperator::SubtractAssign
81            }
82            RegularInstruction::MultiplyAssign(_) => {
83                AssignmentOperator::MultiplyAssign
84            }
85            RegularInstruction::DivideAssign(_) => {
86                AssignmentOperator::DivideAssign
87            }
88            _ => core::todo!(
89                "Assignment operator for instruction {:?} not implemented",
90                instruction
91            ),
92        }
93    }
94}