datex_core/global/operators/
assignment.rs1use 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, AddAssign, SubtractAssign, MultiplyAssign, DivideAssign, ModuloAssign, PowerAssign, BitwiseAndAssign, BitwiseOrAssign, }
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}