@devaloop/devalang 0.0.1-alpha.14 → 0.0.1-alpha.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (177) hide show
  1. package/.devalang +10 -8
  2. package/.github/workflows/ci.yml +92 -0
  3. package/Cargo.toml +60 -58
  4. package/README.md +32 -15
  5. package/docs/CHANGELOG.md +93 -1
  6. package/docs/CONTRIBUTING.md +101 -1
  7. package/docs/ROADMAP.md +2 -2
  8. package/docs/TODO.md +1 -1
  9. package/examples/automation.deva +42 -0
  10. package/examples/bank.deva +4 -4
  11. package/examples/events.deva +12 -0
  12. package/examples/function.deva +4 -4
  13. package/examples/index.deva +39 -25
  14. package/examples/loop.deva +5 -11
  15. package/examples/pattern.deva +8 -0
  16. package/examples/plugin.deva +16 -0
  17. package/examples/variables.deva +1 -1
  18. package/out-tsc/bin/index.js +51 -7
  19. package/out-tsc/index.js +3 -1
  20. package/out-tsc/scripts/postbuild.js +9 -10
  21. package/out-tsc/scripts/postinstall.js +49 -0
  22. package/package.json +12 -4
  23. package/project-version.json +3 -3
  24. package/rust/cli/bank.rs +462 -456
  25. package/rust/cli/build.rs +252 -199
  26. package/rust/cli/check.rs +221 -180
  27. package/rust/cli/driver.rs +297 -292
  28. package/rust/cli/generator.rs +1 -0
  29. package/rust/cli/init.rs +87 -79
  30. package/rust/cli/install.rs +35 -32
  31. package/rust/cli/login.rs +127 -134
  32. package/rust/cli/mod.rs +13 -11
  33. package/rust/cli/play.rs +1123 -218
  34. package/rust/cli/telemetry.rs +19 -0
  35. package/rust/cli/template.rs +69 -57
  36. package/rust/cli/update.rs +6 -4
  37. package/rust/common/api.rs +5 -8
  38. package/rust/common/cdn.rs +3 -6
  39. package/rust/common/mod.rs +3 -3
  40. package/rust/common/sso.rs +3 -6
  41. package/rust/config/driver.rs +118 -94
  42. package/rust/config/loader.rs +165 -156
  43. package/rust/config/mod.rs +4 -2
  44. package/rust/config/settings.rs +91 -0
  45. package/rust/config/stats.rs +257 -0
  46. package/rust/core/audio/engine.rs +696 -518
  47. package/rust/core/audio/evaluator.rs +263 -31
  48. package/rust/core/audio/interpreter/arrow_call.rs +198 -161
  49. package/rust/core/audio/interpreter/automate.rs +18 -0
  50. package/rust/core/audio/interpreter/call.rs +98 -95
  51. package/rust/core/audio/interpreter/condition.rs +70 -71
  52. package/rust/core/audio/interpreter/driver.rs +487 -198
  53. package/rust/core/audio/interpreter/function.rs +26 -21
  54. package/rust/core/audio/interpreter/let_.rs +38 -19
  55. package/rust/core/audio/interpreter/load.rs +18 -18
  56. package/rust/core/audio/interpreter/loop_.rs +113 -73
  57. package/rust/core/audio/interpreter/mod.rs +14 -13
  58. package/rust/core/audio/interpreter/sleep.rs +27 -30
  59. package/rust/core/audio/interpreter/spawn.rs +105 -102
  60. package/rust/core/audio/interpreter/tempo.rs +19 -16
  61. package/rust/core/audio/interpreter/trigger.rs +239 -210
  62. package/rust/core/audio/loader/mod.rs +1 -1
  63. package/rust/core/audio/loader/trigger.rs +100 -97
  64. package/rust/core/audio/mod.rs +7 -6
  65. package/rust/core/audio/player.rs +64 -64
  66. package/rust/core/audio/renderer.rs +56 -53
  67. package/rust/core/audio/special/easing.rs +189 -0
  68. package/rust/core/audio/special/env.rs +43 -0
  69. package/rust/core/audio/special/math.rs +102 -0
  70. package/rust/core/audio/special/mod.rs +9 -0
  71. package/rust/core/audio/special/modulator.rs +143 -0
  72. package/rust/core/builder/mod.rs +80 -85
  73. package/rust/core/debugger/lexer.rs +27 -27
  74. package/rust/core/debugger/mod.rs +24 -23
  75. package/rust/core/debugger/module.rs +55 -47
  76. package/rust/core/debugger/preprocessor.rs +27 -27
  77. package/rust/core/debugger/store.rs +40 -39
  78. package/rust/core/error/mod.rs +80 -66
  79. package/rust/core/lexer/handler/arrow.rs +82 -31
  80. package/rust/core/lexer/handler/at.rs +21 -21
  81. package/rust/core/lexer/handler/brace.rs +41 -41
  82. package/rust/core/lexer/handler/colon.rs +21 -21
  83. package/rust/core/lexer/handler/comment.rs +30 -30
  84. package/rust/core/lexer/handler/dot.rs +21 -21
  85. package/rust/core/lexer/handler/driver.rs +337 -263
  86. package/rust/core/lexer/handler/identifier.rs +46 -42
  87. package/rust/core/lexer/handler/indent.rs +66 -66
  88. package/rust/core/lexer/handler/mod.rs +16 -16
  89. package/rust/core/lexer/handler/newline.rs +23 -23
  90. package/rust/core/lexer/handler/number.rs +31 -31
  91. package/rust/core/lexer/handler/operator.rs +46 -44
  92. package/rust/core/lexer/handler/parenthesis.rs +41 -41
  93. package/rust/core/lexer/handler/slash.rs +21 -21
  94. package/rust/core/lexer/handler/string.rs +63 -63
  95. package/rust/core/lexer/mod.rs +54 -51
  96. package/rust/core/lexer/token.rs +97 -91
  97. package/rust/core/mod.rs +11 -11
  98. package/rust/core/parser/driver.rs +513 -408
  99. package/rust/core/parser/handler/arrow_call.rs +233 -211
  100. package/rust/core/parser/handler/at.rs +245 -162
  101. package/rust/core/parser/handler/bank.rs +94 -69
  102. package/rust/core/parser/handler/condition.rs +80 -74
  103. package/rust/core/parser/handler/dot.rs +143 -135
  104. package/rust/core/parser/handler/identifier/automate.rs +257 -0
  105. package/rust/core/parser/handler/identifier/call.rs +91 -88
  106. package/rust/core/parser/handler/identifier/emit.rs +66 -0
  107. package/rust/core/parser/handler/identifier/function.rs +100 -92
  108. package/rust/core/parser/handler/identifier/group.rs +85 -75
  109. package/rust/core/parser/handler/identifier/let_.rs +158 -127
  110. package/rust/core/parser/handler/identifier/mod.rs +54 -52
  111. package/rust/core/parser/handler/identifier/on.rs +98 -0
  112. package/rust/core/parser/handler/identifier/print.rs +52 -0
  113. package/rust/core/parser/handler/identifier/sleep.rs +36 -33
  114. package/rust/core/parser/handler/identifier/spawn.rs +91 -88
  115. package/rust/core/parser/handler/identifier/synth.rs +65 -65
  116. package/rust/core/parser/handler/loop_.rs +170 -72
  117. package/rust/core/parser/handler/mod.rs +8 -8
  118. package/rust/core/parser/handler/tempo.rs +53 -47
  119. package/rust/core/parser/mod.rs +4 -4
  120. package/rust/core/parser/statement.rs +142 -108
  121. package/rust/core/plugin/loader.rs +123 -48
  122. package/rust/core/plugin/mod.rs +2 -1
  123. package/rust/core/plugin/runner.rs +296 -0
  124. package/rust/core/preprocessor/loader.rs +515 -326
  125. package/rust/core/preprocessor/mod.rs +4 -4
  126. package/rust/core/preprocessor/module.rs +60 -58
  127. package/rust/core/preprocessor/processor.rs +99 -101
  128. package/rust/core/preprocessor/resolver/bank.rs +51 -49
  129. package/rust/core/preprocessor/resolver/call.rs +100 -100
  130. package/rust/core/preprocessor/resolver/condition.rs +97 -97
  131. package/rust/core/preprocessor/resolver/driver.rs +310 -278
  132. package/rust/core/preprocessor/resolver/function.rs +69 -78
  133. package/rust/core/preprocessor/resolver/group.rs +96 -91
  134. package/rust/core/preprocessor/resolver/let_.rs +32 -28
  135. package/rust/core/preprocessor/resolver/loop_.rs +320 -91
  136. package/rust/core/preprocessor/resolver/mod.rs +15 -15
  137. package/rust/core/preprocessor/resolver/spawn.rs +76 -92
  138. package/rust/core/preprocessor/resolver/synth.rs +56 -50
  139. package/rust/core/preprocessor/resolver/tempo.rs +50 -49
  140. package/rust/core/preprocessor/resolver/trigger.rs +113 -116
  141. package/rust/core/preprocessor/resolver/value.rs +81 -87
  142. package/rust/core/shared/bank.rs +1 -1
  143. package/rust/core/shared/duration.rs +9 -9
  144. package/rust/core/shared/mod.rs +3 -3
  145. package/rust/core/shared/value.rs +35 -32
  146. package/rust/core/store/function.rs +34 -34
  147. package/rust/core/store/global.rs +55 -38
  148. package/rust/core/store/mod.rs +5 -5
  149. package/rust/core/store/variable.rs +37 -34
  150. package/rust/core/utils/mod.rs +2 -2
  151. package/rust/core/utils/path.rs +37 -31
  152. package/rust/core/utils/validation.rs +35 -37
  153. package/rust/installer/addon.rs +84 -80
  154. package/rust/installer/bank.rs +62 -65
  155. package/rust/installer/mod.rs +5 -5
  156. package/rust/installer/plugin.rs +54 -55
  157. package/rust/installer/utils.rs +56 -56
  158. package/rust/lib.rs +156 -164
  159. package/rust/main.rs +250 -145
  160. package/rust/utils/error.rs +200 -0
  161. package/rust/utils/file.rs +38 -35
  162. package/rust/utils/first_usage.rs +76 -0
  163. package/rust/utils/logger.rs +195 -139
  164. package/rust/utils/mod.rs +9 -50
  165. package/rust/utils/signature.rs +19 -17
  166. package/rust/utils/spinner.rs +22 -19
  167. package/rust/utils/telemetry.rs +292 -0
  168. package/rust/utils/watcher.rs +34 -33
  169. package/templates/minimal/README.md +97 -121
  170. package/templates/welcome/README.md +97 -121
  171. package/typescript/bin/index.ts +19 -5
  172. package/typescript/index.ts +3 -1
  173. package/typescript/scripts/postbuild.ts +10 -6
  174. package/typescript/scripts/postinstall.ts +56 -0
  175. package/typescript/scripts/version/bump.ts +0 -1
  176. package/typescript/scripts/version/index.ts +0 -1
  177. package/out-tsc/bin/devalang.exe +0 -0
@@ -1,91 +1,320 @@
1
- use std::collections::HashMap;
2
-
3
- use crate::{
4
- core::{
5
- parser::statement::{ Statement, StatementKind },
6
- preprocessor::{
7
- module::Module,
8
- resolver::{ driver::resolve_statement, value::resolve_value },
9
- },
10
- shared::value::Value,
11
- store::global::GlobalStore,
12
- },
13
- utils::logger::Logger,
14
- };
15
-
16
- pub fn resolve_loop(
17
- stmt: &Statement,
18
- module: &Module,
19
- path: &str,
20
- global_store: &mut GlobalStore
21
- ) -> Statement {
22
- let logger = Logger::new();
23
-
24
- let resolved_value = resolve_value(&stmt.value, module, global_store);
25
-
26
- let Value::Map(value_map) = &resolved_value else {
27
- return error_stmt(&logger, module, stmt, "Expected a map for loop value");
28
- };
29
-
30
- let mut resolved_map: HashMap<String, Value> = HashMap::new();
31
- for (key, val) in value_map {
32
- resolved_map.insert(key.clone(), resolve_value(val, module, global_store));
33
- }
34
-
35
- let iterator_value = match resolved_map.get("iterator") {
36
- Some(Value::Number(n)) => Value::Number(*n),
37
- Some(other) => {
38
- error_value(
39
- &logger,
40
- module,
41
- stmt,
42
- &format!("Loop iterator must be a number, found: {:?}", other)
43
- );
44
- Value::Number(1.0)
45
- }
46
- None => {
47
- error_value(&logger, module, stmt, "Missing 'iterator' in loop");
48
- Value::Number(1.0)
49
- }
50
- };
51
-
52
- let body_value = match resolved_map.remove("body") {
53
- Some(Value::Block(stmts)) => {
54
- let resolved = stmts
55
- .iter()
56
- .map(|s| resolve_statement(s, module, path, global_store))
57
- .collect();
58
- Value::Block(resolved)
59
- }
60
- _ => {
61
- error_value(&logger, module, stmt, "Invalid or missing loop body");
62
- Value::Block(vec![])
63
- }
64
- };
65
-
66
- let mut final_map = HashMap::new();
67
- final_map.insert("iterator".to_string(), iterator_value);
68
- final_map.insert("body".to_string(), body_value);
69
-
70
- Statement {
71
- kind: StatementKind::Loop,
72
- value: Value::Map(final_map),
73
- ..stmt.clone()
74
- }
75
- }
76
-
77
- fn error_value(logger: &Logger, module: &Module, stmt: &Statement, msg: &str) {
78
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
79
- logger.log_error_with_stacktrace(msg, &stacktrace);
80
- }
81
-
82
- fn error_stmt(logger: &Logger, module: &Module, stmt: &Statement, msg: &str) -> Statement {
83
- error_value(logger, module, stmt, msg);
84
- Statement {
85
- kind: StatementKind::Error {
86
- message: msg.to_string(),
87
- },
88
- value: Value::Null,
89
- ..stmt.clone()
90
- }
91
- }
1
+ use std::collections::HashMap;
2
+
3
+ use crate::{
4
+ core::{
5
+ parser::statement::{Statement, StatementKind},
6
+ preprocessor::{
7
+ module::Module,
8
+ resolver::{driver::resolve_statement, value::resolve_value},
9
+ },
10
+ shared::value::Value,
11
+ store::global::GlobalStore,
12
+ },
13
+ utils::logger::Logger,
14
+ };
15
+
16
+ pub fn resolve_loop(
17
+ stmt: &Statement,
18
+ module: &Module,
19
+ path: &str,
20
+ global_store: &mut GlobalStore,
21
+ ) -> Statement {
22
+ let logger = Logger::new();
23
+
24
+ let resolved_value = resolve_value(&stmt.value, module, global_store);
25
+
26
+ let Value::Map(value_map) = &resolved_value else {
27
+ return error_stmt(&logger, module, stmt, "Expected a map for loop value");
28
+ };
29
+
30
+ let mut resolved_map: HashMap<String, Value> = HashMap::new();
31
+ for (key, val) in value_map {
32
+ resolved_map.insert(key.clone(), resolve_value(val, module, global_store));
33
+ }
34
+
35
+ // Foreach form takes precedence if present
36
+ if let (Some(Value::Identifier(var_name)), Some(array_val)) =
37
+ (resolved_map.get("foreach"), resolved_map.get("array"))
38
+ {
39
+ // Normalize array_val into an iterable Array
40
+ let resolved_array = match array_val {
41
+ Value::Array(items) => Value::Array(
42
+ items
43
+ .iter()
44
+ .map(|v| resolve_value(v, module, global_store))
45
+ .collect(),
46
+ ),
47
+ Value::Number(n) => {
48
+ // Iterate 0..n-1
49
+ let count = (*n).max(0.0) as usize;
50
+ let mut items = Vec::with_capacity(count);
51
+ for i in 0..count {
52
+ items.push(Value::Number(i as f32));
53
+ }
54
+ Value::Array(items)
55
+ }
56
+ Value::String(s) => {
57
+ // Try to parse a simple comma-separated list: "a,b,c" -> ["a","b","c"]
58
+ // If numeric string: iterate 0..n-1
59
+ if let Ok(n) = s.parse::<f32>() {
60
+ let count = n.max(0.0) as usize;
61
+ let mut items = Vec::with_capacity(count);
62
+ for i in 0..count {
63
+ items.push(Value::Number(i as f32));
64
+ }
65
+ Value::Array(items)
66
+ } else if s.contains(',') {
67
+ let parts: Vec<Value> = s
68
+ .split(',')
69
+ .map(|p| Value::String(p.trim().to_string()))
70
+ .collect();
71
+ Value::Array(parts)
72
+ } else {
73
+ // Fallback: iterate characters
74
+ let parts: Vec<Value> =
75
+ s.chars().map(|c| Value::String(c.to_string())).collect();
76
+ Value::Array(parts)
77
+ }
78
+ }
79
+ Value::Identifier(name) => {
80
+ // Resolve identifier from module variables (already resolved map above)
81
+ let v = if let Some(v) = module.variable_table.get(name) {
82
+ v.clone()
83
+ } else {
84
+ Value::Null
85
+ };
86
+ match v {
87
+ Value::Array(items) => Value::Array(
88
+ items
89
+ .iter()
90
+ .map(|v| resolve_value(v, module, global_store))
91
+ .collect(),
92
+ ),
93
+ Value::Number(n) => {
94
+ let count = n.max(0.0) as usize;
95
+ let mut items = Vec::with_capacity(count);
96
+ for i in 0..count {
97
+ items.push(Value::Number(i as f32));
98
+ }
99
+ Value::Array(items)
100
+ }
101
+ Value::String(s) => {
102
+ if let Ok(n) = s.parse::<f32>() {
103
+ let count = n.max(0.0) as usize;
104
+ let mut items = Vec::with_capacity(count);
105
+ for i in 0..count {
106
+ items.push(Value::Number(i as f32));
107
+ }
108
+ Value::Array(items)
109
+ } else if s.contains(',') {
110
+ let parts: Vec<Value> = s
111
+ .split(',')
112
+ .map(|p| Value::String(p.trim().to_string()))
113
+ .collect();
114
+ Value::Array(parts)
115
+ } else {
116
+ let parts: Vec<Value> =
117
+ s.chars().map(|c| Value::String(c.to_string())).collect();
118
+ Value::Array(parts)
119
+ }
120
+ }
121
+ other => {
122
+ error_value(
123
+ &logger,
124
+ module,
125
+ stmt,
126
+ &format!(
127
+ "Foreach identifier '{}' resolves to unsupported value: {:?}",
128
+ name, other
129
+ ),
130
+ );
131
+ Value::Array(vec![])
132
+ }
133
+ }
134
+ }
135
+ other => {
136
+ // Resolve and normalize if possible
137
+ let v = resolve_value(other, module, global_store);
138
+ match v {
139
+ Value::Array(items) => Value::Array(items),
140
+ Value::Number(n) => {
141
+ let count = n.max(0.0) as usize;
142
+ let mut items = Vec::with_capacity(count);
143
+ for i in 0..count {
144
+ items.push(Value::Number(i as f32));
145
+ }
146
+ Value::Array(items)
147
+ }
148
+ Value::String(s) => {
149
+ if let Ok(n) = s.parse::<f32>() {
150
+ let count = n.max(0.0) as usize;
151
+ let mut items = Vec::with_capacity(count);
152
+ for i in 0..count {
153
+ items.push(Value::Number(i as f32));
154
+ }
155
+ Value::Array(items)
156
+ } else if s.contains(',') {
157
+ let parts: Vec<Value> = s
158
+ .split(',')
159
+ .map(|p| Value::String(p.trim().to_string()))
160
+ .collect();
161
+ Value::Array(parts)
162
+ } else {
163
+ let parts: Vec<Value> =
164
+ s.chars().map(|c| Value::String(c.to_string())).collect();
165
+ Value::Array(parts)
166
+ }
167
+ }
168
+ other => {
169
+ error_value(
170
+ &logger,
171
+ module,
172
+ stmt,
173
+ &format!("Unsupported foreach array value: {:?}", other),
174
+ );
175
+ Value::Array(vec![])
176
+ }
177
+ }
178
+ }
179
+ };
180
+
181
+ let body_value = match resolved_map.get("body") {
182
+ Some(Value::Block(stmts)) => {
183
+ let resolved = stmts
184
+ .iter()
185
+ .map(|s| resolve_statement(s, module, path, global_store))
186
+ .collect();
187
+ Value::Block(resolved)
188
+ }
189
+ _ => {
190
+ error_value(&logger, module, stmt, "Invalid or missing loop body");
191
+ Value::Block(vec![])
192
+ }
193
+ };
194
+
195
+ let mut final_map = HashMap::new();
196
+ final_map.insert("foreach".to_string(), Value::Identifier(var_name.clone()));
197
+ final_map.insert("array".to_string(), resolved_array);
198
+ final_map.insert("body".to_string(), body_value);
199
+
200
+ return Statement {
201
+ kind: StatementKind::Loop,
202
+ value: Value::Map(final_map),
203
+ ..stmt.clone()
204
+ };
205
+ }
206
+
207
+ let iterator_value = match resolved_map.get("iterator") {
208
+ Some(Value::Number(n)) => Value::Number(*n),
209
+ Some(Value::String(s)) => {
210
+ if let Ok(n) = s.parse::<f32>() {
211
+ Value::Number(n)
212
+ } else {
213
+ error_value(
214
+ &logger,
215
+ module,
216
+ stmt,
217
+ &format!("Loop iterator string not numeric: '{}'", s),
218
+ );
219
+ Value::Number(1.0)
220
+ }
221
+ }
222
+ Some(Value::Identifier(name)) => {
223
+ // Try resolving from module vars (may be number or numeric string)
224
+ if let Some(v) = module.variable_table.get(name) {
225
+ match v {
226
+ Value::Number(n) => Value::Number(*n),
227
+ Value::String(s) => {
228
+ if let Ok(n) = s.parse::<f32>() {
229
+ Value::Number(n)
230
+ } else {
231
+ error_value(
232
+ &logger,
233
+ module,
234
+ stmt,
235
+ &format!(
236
+ "Loop iterator '{}' resolves to non-numeric string: '{}'",
237
+ name, s
238
+ ),
239
+ );
240
+ Value::Number(1.0)
241
+ }
242
+ }
243
+ other => {
244
+ error_value(
245
+ &logger,
246
+ module,
247
+ stmt,
248
+ &format!(
249
+ "Loop iterator '{}' resolves to non-number: {:?}",
250
+ name, other
251
+ ),
252
+ );
253
+ Value::Number(1.0)
254
+ }
255
+ }
256
+ } else {
257
+ error_value(
258
+ &logger,
259
+ module,
260
+ stmt,
261
+ &format!("Loop iterator identifier '{}' not found", name),
262
+ );
263
+ Value::Number(1.0)
264
+ }
265
+ }
266
+ Some(other) => {
267
+ error_value(
268
+ &logger,
269
+ module,
270
+ stmt,
271
+ &format!("Loop iterator must be a number, found: {:?}", other),
272
+ );
273
+ Value::Number(1.0)
274
+ }
275
+ None => {
276
+ error_value(&logger, module, stmt, "Missing 'iterator' in loop");
277
+ Value::Number(1.0)
278
+ }
279
+ };
280
+
281
+ let body_value = match resolved_map.get("body") {
282
+ Some(Value::Block(stmts)) => {
283
+ let resolved = stmts
284
+ .iter()
285
+ .map(|s| resolve_statement(s, module, path, global_store))
286
+ .collect();
287
+ Value::Block(resolved)
288
+ }
289
+ _ => {
290
+ error_value(&logger, module, stmt, "Invalid or missing loop body");
291
+ Value::Block(vec![])
292
+ }
293
+ };
294
+
295
+ let mut final_map = HashMap::new();
296
+ final_map.insert("iterator".to_string(), iterator_value);
297
+ final_map.insert("body".to_string(), body_value);
298
+
299
+ Statement {
300
+ kind: StatementKind::Loop,
301
+ value: Value::Map(final_map),
302
+ ..stmt.clone()
303
+ }
304
+ }
305
+
306
+ fn error_value(logger: &Logger, module: &Module, stmt: &Statement, msg: &str) {
307
+ let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
308
+ logger.log_error_with_stacktrace(msg, &stacktrace);
309
+ }
310
+
311
+ fn error_stmt(logger: &Logger, module: &Module, stmt: &Statement, msg: &str) -> Statement {
312
+ error_value(logger, module, stmt, msg);
313
+ Statement {
314
+ kind: StatementKind::Error {
315
+ message: msg.to_string(),
316
+ },
317
+ value: Value::Null,
318
+ ..stmt.clone()
319
+ }
320
+ }
@@ -1,15 +1,15 @@
1
- pub mod driver;
2
-
3
- pub mod value;
4
-
5
- pub mod trigger;
6
- pub mod loop_;
7
- pub mod bank;
8
- pub mod tempo;
9
- pub mod group;
10
- pub mod condition;
11
- pub mod spawn;
12
- pub mod call;
13
- pub mod synth;
14
- pub mod let_;
15
- pub mod function;
1
+ pub mod driver;
2
+
3
+ pub mod value;
4
+
5
+ pub mod bank;
6
+ pub mod call;
7
+ pub mod condition;
8
+ pub mod function;
9
+ pub mod group;
10
+ pub mod let_;
11
+ pub mod loop_;
12
+ pub mod spawn;
13
+ pub mod synth;
14
+ pub mod tempo;
15
+ pub mod trigger;
@@ -1,92 +1,76 @@
1
- use crate::{
2
- core::{
3
- parser::statement::{ Statement, StatementKind },
4
- preprocessor::{
5
- module::Module,
6
- resolver::driver::resolve_statement,
7
- resolver::value::resolve_value,
8
- },
9
- shared::value::Value,
10
- store::global::GlobalStore,
11
- },
12
- utils::logger::{ Logger, LogLevel },
13
- };
14
-
15
- pub fn resolve_spawn(
16
- stmt: &Statement,
17
- name: String,
18
- args: Vec<Value>,
19
- module: &Module,
20
- path: &str,
21
- global_store: &mut GlobalStore
22
- ) -> Statement {
23
- let logger = Logger::new();
24
-
25
- // ✅ Si c'est une fonction
26
- if let Some(func) = global_store.functions.functions.get(&name) {
27
- let mut resolved_map = std::collections::HashMap::new();
28
- resolved_map.insert("name".to_string(), Value::String(name.clone()));
29
- resolved_map.insert("args".to_string(), Value::Array(args.clone()));
30
- resolved_map.insert("body".to_string(), Value::Block(func.body.clone()));
31
-
32
- return Statement {
33
- kind: StatementKind::Spawn { name, args },
34
- value: Value::Map(resolved_map),
35
- ..stmt.clone()
36
- };
37
- }
38
-
39
- // Si c'est un group dans les variables
40
- if let Some(variable) = global_store.variables.variables.get(&name) {
41
- if let Value::Statement(stmt_box) = variable {
42
- if let StatementKind::Group = stmt_box.kind {
43
- if let Value::Map(map) = &stmt_box.value {
44
- if let Some(Value::Block(body)) = map.get("body") {
45
- let mut resolved_map = std::collections::HashMap::new();
46
- resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
47
- resolved_map.insert("args".to_string(), Value::Array(args.clone()));
48
- resolved_map.insert("body".to_string(), Value::Block(body.clone()));
49
-
50
- return Statement {
51
- kind: StatementKind::Spawn { name, args },
52
- value: Value::Map(resolved_map),
53
- ..stmt.clone()
54
- };
55
- }
56
- }
57
- }
58
- }
59
- }
60
-
61
- // ❌ Sinon erreur
62
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
63
- logger.log_message(
64
- LogLevel::Error,
65
- &format!("Function or group '{}' not found for spawn\n → at {stacktrace}", name)
66
- );
67
-
68
- Statement {
69
- kind: StatementKind::Error {
70
- message: format!("Function or group '{}' not found for spawn", name),
71
- },
72
- value: Value::Null,
73
- ..stmt.clone()
74
- }
75
- }
76
-
77
- fn get_group_body(stmt_box: &Statement) -> Vec<Statement> {
78
- if let Value::Block(body) = &stmt_box.value { body.clone() } else { vec![] }
79
- }
80
-
81
- fn error_stmt(logger: &Logger, module: &Module, stmt: &Statement, message: &str) -> Statement {
82
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
83
- logger.log_message(LogLevel::Error, &format!("{message}\n → at {stacktrace}"));
84
-
85
- Statement {
86
- kind: StatementKind::Error {
87
- message: message.to_string(),
88
- },
89
- value: Value::Null,
90
- ..stmt.clone()
91
- }
92
- }
1
+ use crate::{
2
+ core::{
3
+ parser::statement::{Statement, StatementKind},
4
+ preprocessor::module::Module,
5
+ shared::value::Value,
6
+ store::global::GlobalStore,
7
+ },
8
+ utils::logger::{LogLevel, Logger},
9
+ };
10
+
11
+ pub fn resolve_spawn(
12
+ stmt: &Statement,
13
+ name: String,
14
+ args: Vec<Value>,
15
+ module: &Module,
16
+ _path: &str,
17
+ global_store: &mut GlobalStore,
18
+ ) -> Statement {
19
+ let logger = Logger::new();
20
+
21
+ // If it's a function
22
+ if let Some(func) = global_store.functions.functions.get(&name) {
23
+ let mut resolved_map = std::collections::HashMap::new();
24
+ resolved_map.insert("name".to_string(), Value::String(name.clone()));
25
+ resolved_map.insert("args".to_string(), Value::Array(args.clone()));
26
+ resolved_map.insert("body".to_string(), Value::Block(func.body.clone()));
27
+
28
+ return Statement {
29
+ kind: StatementKind::Spawn { name, args },
30
+ value: Value::Map(resolved_map),
31
+ ..stmt.clone()
32
+ };
33
+ }
34
+
35
+ // If it's a group stored in variables
36
+ if let Some(variable) = global_store.variables.variables.get(&name) {
37
+ if let Value::Statement(stmt_box) = variable {
38
+ if let StatementKind::Group = stmt_box.kind {
39
+ if let Value::Map(map) = &stmt_box.value {
40
+ if let Some(Value::Block(body)) = map.get("body") {
41
+ let mut resolved_map = std::collections::HashMap::new();
42
+ resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
43
+ resolved_map.insert("args".to_string(), Value::Array(args.clone()));
44
+ resolved_map.insert("body".to_string(), Value::Block(body.clone()));
45
+
46
+ return Statement {
47
+ kind: StatementKind::Spawn { name, args },
48
+ value: Value::Map(resolved_map),
49
+ ..stmt.clone()
50
+ };
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
56
+
57
+ // Otherwise, log an error
58
+ let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
59
+ logger.log_message(
60
+ LogLevel::Error,
61
+ &format!(
62
+ "Function or group '{}' not found for spawn\n → at {stacktrace}",
63
+ name
64
+ ),
65
+ );
66
+
67
+ Statement {
68
+ kind: StatementKind::Error {
69
+ message: format!("Function or group '{}' not found for spawn", name),
70
+ },
71
+ value: Value::Null,
72
+ ..stmt.clone()
73
+ }
74
+ }
75
+
76
+ // (removed unused helpers get_group_body, error_stmt)