use anyhow::Result;
use crate::expr::{ControlFlow, FlowResult};
use crate::val::Value;
pub(crate) trait FlowResultExt {
fn catch_return(self) -> Result<Value, anyhow::Error>;
fn or_none(self) -> FlowResult<Value>;
}
impl FlowResultExt for FlowResult<Value> {
fn catch_return(self) -> Result<Value, anyhow::Error> {
match self {
Err(ControlFlow::Break) | Err(ControlFlow::Continue) => {
Err(anyhow::Error::new(crate::exec::Error::InvalidControlFlow))
}
Err(ControlFlow::Return(x)) => Ok(x),
Err(ControlFlow::Err(e)) => Err(e),
Ok(x) => Ok(x),
}
}
fn or_none(self) -> FlowResult<Value> {
match self {
Ok(v) => Ok(v),
Err(cf) if cf.is_ignorable() => Ok(Value::None),
Err(cf) => Err(cf),
}
}
}