42 lines
760 B
Rust
42 lines
760 B
Rust
|
use std::rc::Rc;
|
||
|
use std::str::FromStr;
|
||
|
|
||
|
use crate::builtin::Builtin;
|
||
|
|
||
|
#[derive(Debug, PartialEq, Clone)]
|
||
|
pub struct PrefixOp {
|
||
|
pub sigil: Rc<String>,
|
||
|
pub builtin: Option<Builtin>,
|
||
|
}
|
||
|
|
||
|
impl PrefixOp {
|
||
|
pub fn sigil(&self) -> &Rc<String> {
|
||
|
&self.sigil
|
||
|
}
|
||
|
pub fn is_prefix(op: &str) -> bool {
|
||
|
match op {
|
||
|
"+" => true,
|
||
|
"-" => true,
|
||
|
"!" => true,
|
||
|
_ => false
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
impl FromStr for PrefixOp {
|
||
|
type Err = ();
|
||
|
|
||
|
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||
|
use Builtin::*;
|
||
|
|
||
|
let builtin = match s {
|
||
|
"+" => Ok(Increment),
|
||
|
"-" => Ok(Negate),
|
||
|
"!" => Ok(BooleanNot),
|
||
|
_ => Err(())
|
||
|
};
|
||
|
|
||
|
builtin.map(|builtin| PrefixOp { sigil: Rc::new(s.to_string()), builtin: Some(builtin) })
|
||
|
}
|
||
|
}
|