use crate::core::source::Span;
use super::{ActionId, GlobalVarId, PlayerVarId, SubroutineId, ValueId};
#[derive(Debug, Clone)]
pub enum Action {
SetGlobalVariable {
variable: GlobalVarId,
value: ValueId,
span: Option<Span>,
target_span: Option<Span>,
},
ModifyGlobalVariable {
variable: GlobalVarId,
op: ModifyOp,
value: ValueId,
span: Option<Span>,
target_span: Option<Span>,
},
SetPlayerVariable {
player: ValueId,
variable: PlayerVarId,
value: ValueId,
span: Option<Span>,
target_span: Option<Span>,
},
ModifyPlayerVariable {
player: ValueId,
variable: PlayerVarId,
op: ModifyOp,
value: ValueId,
span: Option<Span>,
target_span: Option<Span>,
},
AssignMember {
target: ValueId,
op: Option<ModifyOp>,
value: ValueId,
span: Option<Span>,
},
CallSubroutine {
subroutine: SubroutineId,
span: Option<Span>,
callee_span: Option<Span>,
},
If {
branches: Vec<IfBranch>,
else_body: Option<Vec<ActionId>>,
span: Option<Span>,
},
While {
condition: ValueId,
body: Vec<ActionId>,
span: Option<Span>,
},
ForGlobalVariable {
variable: GlobalVarId,
start: ValueId,
stop: ValueId,
step: ValueId,
body: Vec<ActionId>,
span: Option<Span>,
target_span: Option<Span>,
},
ForPlayerVariable {
player: ValueId,
variable: PlayerVarId,
start: ValueId,
stop: ValueId,
step: ValueId,
body: Vec<ActionId>,
span: Option<Span>,
},
Call {
name: String,
args: Vec<ValueId>,
span: Option<Span>,
},
}
impl Action {
pub fn span(&self) -> Option<Span> {
match self {
Action::SetGlobalVariable { span, .. }
| Action::ModifyGlobalVariable { span, .. }
| Action::SetPlayerVariable { span, .. }
| Action::ModifyPlayerVariable { span, .. }
| Action::AssignMember { span, .. }
| Action::CallSubroutine { span, .. }
| Action::If { span, .. }
| Action::While { span, .. }
| Action::ForGlobalVariable { span, .. }
| Action::ForPlayerVariable { span, .. }
| Action::Call { span, .. } => *span,
}
}
}
#[derive(Debug, Clone)]
pub struct IfBranch {
pub condition: ValueId,
pub body: Vec<ActionId>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ModifyOp {
Add,
Subtract,
Multiply,
Divide,
Modulo,
Min,
Max,
RaiseToPower,
AppendToArray,
RemoveFromArray,
RemoveFromArrayByIndex,
}
impl ModifyOp {
pub fn as_str(self) -> &'static str {
match self {
ModifyOp::Add => "Add",
ModifyOp::Subtract => "Subtract",
ModifyOp::Multiply => "Multiply",
ModifyOp::Divide => "Divide",
ModifyOp::Modulo => "Modulo",
ModifyOp::Min => "Min",
ModifyOp::Max => "Max",
ModifyOp::RaiseToPower => "RaiseToPower",
ModifyOp::AppendToArray => "AppendToArray",
ModifyOp::RemoveFromArray => "RemoveFromArray",
ModifyOp::RemoveFromArrayByIndex => "RemoveFromArrayByIndex",
}
}
pub fn catalog_id(self) -> &'static str {
match self {
ModifyOp::Add => "add",
ModifyOp::Subtract => "subtract",
ModifyOp::Multiply => "multiply",
ModifyOp::Divide => "divide",
ModifyOp::Modulo => "modulo",
ModifyOp::Min => "min",
ModifyOp::Max => "max",
ModifyOp::RaiseToPower => "raiseToPower",
ModifyOp::AppendToArray => "appendToArray",
ModifyOp::RemoveFromArray => "removeFromArray",
ModifyOp::RemoveFromArrayByIndex => "removeFromArrayByIndex",
}
}
}