diff --git a/src/compile.rs b/src/compile.rs index f6f0e1c..9b0ad46 100644 --- a/src/compile.rs +++ b/src/compile.rs @@ -109,6 +109,35 @@ pub enum Mode { Single, } +impl std::str::FromStr for Mode { + type Err = ModeParseError; + fn from_str(s: &str) -> Result { + match s { + "exec" => Ok(Mode::Exec), + "eval" => Ok(Mode::Eval), + "single" => Ok(Mode::Single), + _ => Err(ModeParseError { _priv: () }), + } + } +} + +#[derive(Debug)] +pub struct ModeParseError { + _priv: (), +} + +impl std::fmt::Display for ModeParseError { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, r#"mode should be "exec", "eval", or "single""#) + } +} + +#[derive(Clone, Copy)] +enum EvalContext { + Statement, + Expression, +} + pub(crate) type Label = usize; impl Default for Compiler