datex_core/global/operators/
assignment.rs

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