use derive_more::Display;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Display)]
#[display(rename_all = "lowercase")]
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,
#[display("as_deref")]
AsDeref,
#[display("as_deref_mut")]
AsDerefMut,
}
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 is_cmp(&self) -> bool {
matches!(
self,
Operator::Eq | Operator::Ne | Operator::Lt | Operator::Le | Operator::Gt | Operator::Ge
)
}
pub fn op_name(&self) -> String {
if self.is_assign() {
let name = self.to_string();
format!("{}_assign", &name[..name.len() - 6])
} else {
self.to_string()
}
}
}