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