1use crate::core::source::Span;
4
5use super::{ActionId, GlobalVarId, PlayerVarId, SubroutineId, ValueId};
6
7#[derive(Debug, Clone)]
9pub enum Action {
10 SetGlobalVariable {
11 variable: GlobalVarId,
12 value: ValueId,
13 span: Option<Span>,
14 target_span: Option<Span>,
16 },
17 ModifyGlobalVariable {
18 variable: GlobalVarId,
19 op: ModifyOp,
20 value: ValueId,
21 span: Option<Span>,
22 target_span: Option<Span>,
24 },
25 SetPlayerVariable {
26 player: ValueId,
27 variable: PlayerVarId,
28 value: ValueId,
29 span: Option<Span>,
30 target_span: Option<Span>,
32 },
33 ModifyPlayerVariable {
34 player: ValueId,
35 variable: PlayerVarId,
36 op: ModifyOp,
37 value: ValueId,
38 span: Option<Span>,
39 target_span: Option<Span>,
41 },
42 AssignMember {
46 target: ValueId,
47 op: Option<ModifyOp>,
48 value: ValueId,
49 span: Option<Span>,
50 },
51 CallSubroutine {
52 subroutine: SubroutineId,
53 span: Option<Span>,
54 callee_span: Option<Span>,
56 },
57 If {
58 branches: Vec<IfBranch>,
59 else_body: Option<Vec<ActionId>>,
60 span: Option<Span>,
61 },
62 While {
63 condition: ValueId,
64 body: Vec<ActionId>,
65 span: Option<Span>,
66 },
67 ForGlobalVariable {
68 variable: GlobalVarId,
69 start: ValueId,
70 stop: ValueId,
71 step: ValueId,
72 body: Vec<ActionId>,
73 span: Option<Span>,
74 target_span: Option<Span>,
76 },
77 ForPlayerVariable {
82 player: ValueId,
83 variable: PlayerVarId,
84 start: ValueId,
85 stop: ValueId,
86 step: ValueId,
87 body: Vec<ActionId>,
88 span: Option<Span>,
89 },
90 Call {
92 name: String,
93 args: Vec<ValueId>,
94 span: Option<Span>,
95 },
96}
97
98impl Action {
99 pub fn span(&self) -> Option<Span> {
101 match self {
102 Action::SetGlobalVariable { span, .. }
103 | Action::ModifyGlobalVariable { span, .. }
104 | Action::SetPlayerVariable { span, .. }
105 | Action::ModifyPlayerVariable { span, .. }
106 | Action::AssignMember { span, .. }
107 | Action::CallSubroutine { span, .. }
108 | Action::If { span, .. }
109 | Action::While { span, .. }
110 | Action::ForGlobalVariable { span, .. }
111 | Action::ForPlayerVariable { span, .. }
112 | Action::Call { span, .. } => *span,
113 }
114 }
115}
116
117#[derive(Debug, Clone)]
119pub struct IfBranch {
120 pub condition: ValueId,
121 pub body: Vec<ActionId>,
122}
123
124#[derive(Debug, Clone, Copy, PartialEq, Eq)]
126pub enum ModifyOp {
127 Add,
128 Subtract,
129 Multiply,
130 Divide,
131 Modulo,
132 Min,
133 Max,
134 RaiseToPower,
135 AppendToArray,
136 RemoveFromArray,
137 RemoveFromArrayByIndex,
138}
139
140impl ModifyOp {
141 pub fn as_str(self) -> &'static str {
143 match self {
144 ModifyOp::Add => "Add",
145 ModifyOp::Subtract => "Subtract",
146 ModifyOp::Multiply => "Multiply",
147 ModifyOp::Divide => "Divide",
148 ModifyOp::Modulo => "Modulo",
149 ModifyOp::Min => "Min",
150 ModifyOp::Max => "Max",
151 ModifyOp::RaiseToPower => "RaiseToPower",
152 ModifyOp::AppendToArray => "AppendToArray",
153 ModifyOp::RemoveFromArray => "RemoveFromArray",
154 ModifyOp::RemoveFromArrayByIndex => "RemoveFromArrayByIndex",
155 }
156 }
157
158 pub fn catalog_id(self) -> &'static str {
160 match self {
161 ModifyOp::Add => "add",
162 ModifyOp::Subtract => "subtract",
163 ModifyOp::Multiply => "multiply",
164 ModifyOp::Divide => "divide",
165 ModifyOp::Modulo => "modulo",
166 ModifyOp::Min => "min",
167 ModifyOp::Max => "max",
168 ModifyOp::RaiseToPower => "raiseToPower",
169 ModifyOp::AppendToArray => "appendToArray",
170 ModifyOp::RemoveFromArray => "removeFromArray",
171 ModifyOp::RemoveFromArrayByIndex => "removeFromArrayByIndex",
172 }
173 }
174}