use std::fmt::Display;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Operator {
Add,
Sub,
Mul,
Div,
Rem,
AddAssign,
SubAssign,
MulAssign,
DivAssign,
RemAssign,
Eq,
Ne,
Lt,
Le,
Ge,
Gt,
And,
Or,
BitXor,
BitAnd,
BitOr,
BitXorAssign,
BitAndAssign,
BitOrAssign,
Shl,
Shr,
ShlAssign,
ShrAssign,
Deref,
Not,
Neg,
}
impl Display for Operator {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_fmt(format_args!("{self:?}"))
}
}
impl Operator {
pub fn is_assign(&self) -> bool {
matches!(
self,
Operator::AddAssign
| Operator::SubAssign
| Operator::MulAssign
| Operator::DivAssign
| Operator::RemAssign
| Operator::BitXorAssign
| Operator::BitAndAssign
| Operator::BitOrAssign
| Operator::ShlAssign
| Operator::ShrAssign
)
}
pub fn op_name(&self) -> String {
if self.is_assign() {
let name = self.to_string().to_lowercase();
format!("{}_assign_op", &name[..name.len() - 6])
} else {
self.to_string().to_lowercase()
}
}
pub fn array_op_name(&self) -> String {
if self.is_assign() {
let name = self.to_string().to_lowercase();
format!("{}_assign_array_op", &name[..name.len() - 6])
} else {
self.to_string().to_lowercase()
}
}
}