use crate::runtime::values::Value;
#[derive(Debug, Clone)]
pub enum ControlFlow {
Continue,
Break(Option<Value>),
Next,
}
impl ControlFlow {
pub fn is_continue(&self) -> bool {
matches!(self, ControlFlow::Continue)
}
pub fn is_break(&self) -> bool {
matches!(self, ControlFlow::Break(_))
}
pub fn is_next(&self) -> bool {
matches!(self, ControlFlow::Next)
}
pub fn break_value(self) -> Option<Value> {
match self {
ControlFlow::Break(value) => value,
_ => None,
}
}
}
pub type StatementResult = Result<StatementOutcome, crate::runtime::functions::RuntimeError>;
#[derive(Debug, Clone)]
pub enum StatementOutcome {
Value(Value),
ControlFlow(ControlFlow),
}
impl StatementOutcome {
pub fn value(v: Value) -> Self {
StatementOutcome::Value(v)
}
pub fn break_with_value(v: Option<Value>) -> Self {
StatementOutcome::ControlFlow(ControlFlow::Break(v))
}
pub fn next() -> Self {
StatementOutcome::ControlFlow(ControlFlow::Next)
}
pub fn as_value(&self) -> Option<&Value> {
match self {
StatementOutcome::Value(v) => Some(v),
_ => None,
}
}
pub fn as_control_flow(&self) -> Option<&ControlFlow> {
match self {
StatementOutcome::ControlFlow(cf) => Some(cf),
_ => None,
}
}
pub fn is_control_flow(&self) -> bool {
matches!(self, StatementOutcome::ControlFlow(_))
}
}
impl From<Value> for StatementOutcome {
fn from(value: Value) -> Self {
StatementOutcome::Value(value)
}
}