@devaloop/devalang 0.0.1-beta.1 → 0.0.1-beta.2

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 (220) hide show
  1. package/.devalang +9 -10
  2. package/Cargo.toml +5 -4
  3. package/README.md +7 -5
  4. package/docs/CHANGELOG.md +42 -0
  5. package/docs/ROADMAP.md +5 -1
  6. package/docs/TODO.md +3 -14
  7. package/examples/bus.deva +10 -0
  8. package/examples/effect.deva +2 -0
  9. package/examples/filter.deva +11 -0
  10. package/examples/lfo.deva +9 -0
  11. package/examples/synth.deva +11 -1
  12. package/examples/synth_types.deva +17 -0
  13. package/out-tsc/core/functions/index.d.ts +5 -0
  14. package/out-tsc/core/functions/index.js +11 -0
  15. package/out-tsc/pkg/devalang_core.d.ts +2 -0
  16. package/out-tsc/pkg/devalang_core.js +17 -2
  17. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +8 -7
  18. package/package.json +1 -1
  19. package/project-version.json +3 -3
  20. package/rust/cli/bank/api.rs +122 -122
  21. package/rust/cli/bank/commands.rs +33 -2
  22. package/rust/cli/bank/mod.rs +29 -29
  23. package/rust/cli/build/commands.rs +53 -3
  24. package/rust/cli/build/mod.rs +2 -2
  25. package/rust/cli/build/process.rs +26 -7
  26. package/rust/cli/check/mod.rs +2 -2
  27. package/rust/cli/discover/commands.rs +253 -253
  28. package/rust/cli/discover/config.rs +111 -111
  29. package/rust/cli/discover/fs.rs +19 -19
  30. package/rust/cli/discover/install.rs +103 -103
  31. package/rust/cli/discover/metadata.rs +48 -48
  32. package/rust/cli/discover/mod.rs +5 -5
  33. package/rust/cli/install/addon.rs +118 -118
  34. package/rust/cli/install/bank.rs +22 -3
  35. package/rust/cli/install/commands.rs +35 -35
  36. package/rust/cli/install/mod.rs +4 -4
  37. package/rust/cli/install/plugin.rs +80 -61
  38. package/rust/cli/login/commands.rs +124 -124
  39. package/rust/cli/mod.rs +12 -12
  40. package/rust/cli/parser.rs +46 -1
  41. package/rust/cli/play/commands.rs +71 -20
  42. package/rust/cli/play/mod.rs +5 -5
  43. package/rust/cli/play/process.rs +14 -5
  44. package/rust/cli/play/realtime.rs +91 -91
  45. package/rust/cli/telemetry/commands.rs +22 -22
  46. package/rust/cli/telemetry/event_creator.rs +80 -80
  47. package/rust/cli/telemetry/mod.rs +3 -3
  48. package/rust/cli/telemetry/send.rs +51 -51
  49. package/rust/cli/template/commands.rs +69 -69
  50. package/rust/config/driver.rs +112 -103
  51. package/rust/config/mod.rs +3 -3
  52. package/rust/config/ops.rs +26 -26
  53. package/rust/config/settings.rs +101 -101
  54. package/rust/core/audio/engine/driver.rs +220 -0
  55. package/rust/core/audio/engine/export.rs +169 -0
  56. package/rust/core/audio/engine/helpers.rs +178 -170
  57. package/rust/core/audio/engine/mod.rs +51 -2
  58. package/rust/core/audio/engine/notes/dsp.rs +85 -0
  59. package/rust/core/audio/engine/notes/mod.rs +44 -0
  60. package/rust/core/audio/engine/notes/params.rs +294 -0
  61. package/rust/core/audio/engine/sample/insert.rs +199 -0
  62. package/rust/core/audio/engine/sample/mod.rs +40 -0
  63. package/rust/core/audio/engine/sample/padding.rs +170 -0
  64. package/rust/core/audio/evaluator/condition.rs +61 -0
  65. package/rust/core/audio/evaluator/mod.rs +9 -0
  66. package/rust/core/audio/{evaluator.rs → evaluator/numeric.rs} +1 -159
  67. package/rust/core/audio/evaluator/rhs.rs +16 -0
  68. package/rust/core/audio/evaluator/string_expr.rs +94 -0
  69. package/rust/core/audio/interpreter/driver.rs +55 -23
  70. package/rust/core/audio/interpreter/mod.rs +1 -13
  71. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +175 -0
  72. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +384 -0
  73. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +2 -0
  74. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +316 -0
  75. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +3 -0
  76. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +192 -0
  77. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +24 -0
  78. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +116 -0
  79. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +97 -0
  80. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +100 -0
  81. package/rust/core/audio/interpreter/{automate.rs → statements/automate.rs} +16 -18
  82. package/rust/core/audio/interpreter/{call.rs → statements/call.rs} +5 -4
  83. package/rust/core/audio/interpreter/{condition.rs → statements/condition.rs} +2 -1
  84. package/rust/core/audio/interpreter/{function.rs → statements/function.rs} +2 -4
  85. package/rust/core/audio/interpreter/{let_.rs → statements/let_.rs} +2 -4
  86. package/rust/core/audio/interpreter/{load.rs → statements/load.rs} +2 -4
  87. package/rust/core/audio/interpreter/{loop_.rs → statements/loop_.rs} +2 -1
  88. package/rust/core/audio/interpreter/statements/mod.rs +12 -0
  89. package/rust/core/audio/interpreter/{sleep.rs → statements/sleep.rs} +28 -28
  90. package/rust/core/audio/interpreter/{spawn.rs → statements/spawn.rs} +3 -2
  91. package/rust/core/audio/interpreter/{tempo.rs → statements/tempo.rs} +40 -40
  92. package/rust/core/audio/interpreter/{trigger.rs → statements/trigger.rs} +1 -1
  93. package/rust/core/audio/loader/trigger.rs +2 -1
  94. package/rust/core/audio/mod.rs +6 -7
  95. package/rust/core/audio/player.rs +70 -70
  96. package/rust/core/audio/special/easing.rs +189 -189
  97. package/rust/core/audio/special/env.rs +45 -45
  98. package/rust/core/audio/special/math.rs +134 -134
  99. package/rust/core/audio/special/mod.rs +9 -9
  100. package/rust/core/audio/special/modulator.rs +143 -143
  101. package/rust/core/builder/mod.rs +45 -2
  102. package/rust/core/debugger/lexer.rs +27 -27
  103. package/rust/core/debugger/{module.rs → logs.rs} +3 -6
  104. package/rust/core/debugger/mod.rs +30 -30
  105. package/rust/core/debugger/preprocessor.rs +27 -27
  106. package/rust/core/debugger/store.rs +2 -4
  107. package/rust/core/error/mod.rs +269 -269
  108. package/rust/core/lexer/driver.rs +59 -61
  109. package/rust/core/lexer/handler/arrow.rs +82 -82
  110. package/rust/core/lexer/handler/at.rs +21 -21
  111. package/rust/core/lexer/handler/brace.rs +41 -41
  112. package/rust/core/lexer/handler/colon.rs +21 -21
  113. package/rust/core/lexer/handler/comment.rs +30 -30
  114. package/rust/core/lexer/handler/dot.rs +21 -21
  115. package/rust/core/lexer/handler/driver.rs +337 -337
  116. package/rust/core/lexer/handler/identifier.rs +47 -47
  117. package/rust/core/lexer/handler/indent.rs +66 -66
  118. package/rust/core/lexer/handler/mod.rs +15 -15
  119. package/rust/core/lexer/handler/newline.rs +23 -23
  120. package/rust/core/lexer/handler/number.rs +31 -31
  121. package/rust/core/lexer/handler/operator.rs +46 -46
  122. package/rust/core/lexer/handler/parenthesis.rs +41 -41
  123. package/rust/core/lexer/handler/slash.rs +21 -21
  124. package/rust/core/lexer/handler/string.rs +63 -63
  125. package/rust/core/lexer/mod.rs +3 -3
  126. package/rust/core/mod.rs +0 -1
  127. package/rust/core/parser/driver/block.rs +111 -0
  128. package/rust/core/parser/driver/cursor.rs +82 -0
  129. package/rust/core/parser/driver/driver_impl.rs +139 -0
  130. package/rust/core/parser/driver/mod.rs +6 -0
  131. package/rust/core/parser/driver/parse_array.rs +120 -0
  132. package/rust/core/parser/driver/parse_map.rs +223 -0
  133. package/rust/core/parser/driver/parser.rs +160 -0
  134. package/rust/core/parser/handler/arrow_call.rs +28 -4
  135. package/rust/core/parser/handler/at.rs +279 -279
  136. package/rust/core/parser/handler/bank.rs +104 -104
  137. package/rust/core/parser/handler/condition.rs +83 -83
  138. package/rust/core/parser/handler/dot.rs +148 -148
  139. package/rust/core/parser/handler/identifier/automate.rs +254 -254
  140. package/rust/core/parser/handler/identifier/call.rs +91 -91
  141. package/rust/core/parser/handler/identifier/emit.rs +70 -70
  142. package/rust/core/parser/handler/identifier/function.rs +113 -113
  143. package/rust/core/parser/handler/identifier/group.rs +89 -89
  144. package/rust/core/parser/handler/identifier/let_.rs +173 -173
  145. package/rust/core/parser/handler/identifier/mod.rs +55 -55
  146. package/rust/core/parser/handler/identifier/on.rs +107 -107
  147. package/rust/core/parser/handler/identifier/print.rs +49 -49
  148. package/rust/core/parser/handler/identifier/sleep.rs +96 -43
  149. package/rust/core/parser/handler/identifier/spawn.rs +91 -91
  150. package/rust/core/parser/handler/identifier/synth.rs +135 -135
  151. package/rust/core/parser/handler/loop_.rs +194 -194
  152. package/rust/core/parser/handler/mod.rs +9 -9
  153. package/rust/core/parser/handler/pattern.rs +1 -1
  154. package/rust/core/parser/handler/tempo.rs +105 -57
  155. package/rust/core/parser/statement.rs +10 -11
  156. package/rust/core/plugin/loader.rs +1 -1
  157. package/rust/core/plugin/mod.rs +2 -2
  158. package/rust/core/plugin/runner/mod.rs +11 -0
  159. package/rust/core/plugin/{runner.rs → runner/non_wasm.rs} +297 -347
  160. package/rust/core/plugin/runner/wasm32.rs +43 -0
  161. package/rust/core/preprocessor/loader/inject.rs +278 -0
  162. package/rust/core/preprocessor/loader/loader_helpers.rs +110 -0
  163. package/rust/core/preprocessor/loader/mod.rs +235 -0
  164. package/rust/core/preprocessor/module.rs +2 -7
  165. package/rust/core/preprocessor/{processor.rs → processor/handlers.rs} +6 -13
  166. package/rust/core/preprocessor/processor/mod.rs +1 -0
  167. package/rust/core/preprocessor/resolver/bank.rs +49 -49
  168. package/rust/core/preprocessor/resolver/call.rs +124 -124
  169. package/rust/core/preprocessor/resolver/condition.rs +95 -95
  170. package/rust/core/preprocessor/resolver/driver.rs +324 -324
  171. package/rust/core/preprocessor/resolver/function.rs +2 -2
  172. package/rust/core/preprocessor/resolver/group.rs +46 -18
  173. package/rust/core/preprocessor/resolver/let_.rs +32 -32
  174. package/rust/core/preprocessor/resolver/loop_.rs +318 -318
  175. package/rust/core/preprocessor/resolver/mod.rs +16 -16
  176. package/rust/core/preprocessor/resolver/pattern.rs +83 -83
  177. package/rust/core/preprocessor/resolver/spawn.rs +99 -99
  178. package/rust/core/preprocessor/resolver/synth.rs +54 -54
  179. package/rust/core/preprocessor/resolver/tempo.rs +48 -48
  180. package/rust/core/preprocessor/resolver/trigger.rs +116 -116
  181. package/rust/core/preprocessor/resolver/value.rs +176 -176
  182. package/rust/core/store/global.rs +2 -6
  183. package/rust/core/store/mod.rs +1 -5
  184. package/rust/lib.rs +18 -3
  185. package/rust/main.rs +27 -3
  186. package/rust/types/Cargo.toml +1 -1
  187. package/rust/types/src/addons.rs +55 -55
  188. package/rust/types/src/config.rs +84 -74
  189. package/rust/types/src/lib.rs +15 -12
  190. package/rust/types/src/plugin.rs +20 -0
  191. package/rust/types/src/store.rs +139 -0
  192. package/rust/types/src/telemetry.rs +85 -85
  193. package/rust/utils/Cargo.toml +2 -2
  194. package/rust/utils/src/file.rs +94 -94
  195. package/rust/utils/src/first_usage.rs +97 -97
  196. package/rust/utils/src/lib.rs +9 -9
  197. package/rust/utils/src/logger.rs +200 -200
  198. package/rust/utils/src/path.rs +129 -88
  199. package/rust/utils/src/signature.rs +41 -41
  200. package/rust/utils/src/spinner.rs +20 -20
  201. package/rust/utils/src/version.rs +27 -27
  202. package/rust/utils/src/watcher.rs +46 -46
  203. package/rust/web/api.rs +5 -5
  204. package/rust/web/cdn.rs +34 -34
  205. package/rust/web/mod.rs +3 -3
  206. package/tests/integration.rs +21 -21
  207. package/typescript/core/functions/index.ts +11 -0
  208. package/typescript/pkg/devalang_core.ts +20 -4
  209. package/rust/core/audio/engine/sample.rs +0 -366
  210. package/rust/core/audio/engine/synth.rs +0 -325
  211. package/rust/core/audio/interpreter/arrow_call.rs +0 -311
  212. package/rust/core/audio/renderer.rs +0 -54
  213. package/rust/core/parser/driver.rs +0 -584
  214. package/rust/core/preprocessor/loader.rs +0 -637
  215. package/rust/core/store/export.rs +0 -28
  216. package/rust/core/store/function.rs +0 -40
  217. package/rust/core/store/import.rs +0 -28
  218. package/rust/core/store/variable.rs +0 -51
  219. package/rust/core/utils/mod.rs +0 -1
  220. package/rust/core/utils/path.rs +0 -37
@@ -1,83 +1,83 @@
1
- use crate::core::{
2
- parser::statement::{Statement, StatementKind},
3
- preprocessor::module::Module,
4
- store::global::GlobalStore,
5
- };
6
- use devalang_types::Value;
7
- use devalang_utils::logger::{LogLevel, Logger};
8
-
9
- pub fn resolve_pattern(
10
- stmt: &Statement,
11
- module: &Module,
12
- path: &str,
13
- global_store: &mut GlobalStore,
14
- ) -> Statement {
15
- let logger = Logger::new();
16
-
17
- // Expecting pattern name stored on the Statement.kind; value may contain the string
18
- if let StatementKind::Pattern { name, target } = &stmt.kind {
19
- // Ensure name doesn't already exist
20
- if global_store.variables.variables.contains_key(name) {
21
- logger.log_error_with_stacktrace(
22
- &format!("Pattern identifier '{}' already exists", name),
23
- path,
24
- );
25
- return Statement {
26
- kind: StatementKind::Error {
27
- message: format!("Pattern '{}' already exists", name),
28
- },
29
- ..stmt.clone()
30
- };
31
- }
32
-
33
- // Resolve potential target and pattern string value
34
- let resolved_value = resolve_value(&stmt.value, module, global_store);
35
-
36
- // Build a map to store the pattern definition
37
- let mut map = std::collections::HashMap::new();
38
- map.insert("identifier".to_string(), Value::String(name.clone()));
39
- if let Some(t) = target {
40
- map.insert("target".to_string(), Value::String(t.clone()));
41
- }
42
- // Keep raw pattern in 'pattern' key
43
- map.insert("pattern".to_string(), resolved_value.clone());
44
-
45
- let resolved_stmt = Statement {
46
- kind: StatementKind::Pattern {
47
- name: name.clone(),
48
- target: target.clone(),
49
- },
50
- value: resolved_value,
51
- ..stmt.clone()
52
- };
53
-
54
- // Store into global variables as a Statement
55
- global_store.variables.variables.insert(
56
- name.clone(),
57
- Value::Statement(Box::new(resolved_stmt.clone())),
58
- );
59
-
60
- return resolved_stmt;
61
- }
62
-
63
- logger.log_message(
64
- LogLevel::Warning,
65
- "resolve_pattern called on non-pattern statement",
66
- );
67
- stmt.clone()
68
- }
69
-
70
- fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore) -> Value {
71
- // reuse driver::resolve_value logic; simple local resolution for pattern value
72
- match value {
73
- Value::String(s) => Value::String(s.clone()),
74
- Value::Map(m) => {
75
- let mut resolved = std::collections::HashMap::new();
76
- for (k, v) in m {
77
- resolved.insert(k.clone(), resolve_value(v, module, global_store));
78
- }
79
- Value::Map(resolved)
80
- }
81
- other => other.clone(),
82
- }
83
- }
1
+ use crate::core::{
2
+ parser::statement::{Statement, StatementKind},
3
+ preprocessor::module::Module,
4
+ store::global::GlobalStore,
5
+ };
6
+ use devalang_types::Value;
7
+ use devalang_utils::logger::{LogLevel, Logger};
8
+
9
+ pub fn resolve_pattern(
10
+ stmt: &Statement,
11
+ module: &Module,
12
+ path: &str,
13
+ global_store: &mut GlobalStore,
14
+ ) -> Statement {
15
+ let logger = Logger::new();
16
+
17
+ // Expecting pattern name stored on the Statement.kind; value may contain the string
18
+ if let StatementKind::Pattern { name, target } = &stmt.kind {
19
+ // Ensure name doesn't already exist
20
+ if global_store.variables.variables.contains_key(name) {
21
+ logger.log_error_with_stacktrace(
22
+ &format!("Pattern identifier '{}' already exists", name),
23
+ path,
24
+ );
25
+ return Statement {
26
+ kind: StatementKind::Error {
27
+ message: format!("Pattern '{}' already exists", name),
28
+ },
29
+ ..stmt.clone()
30
+ };
31
+ }
32
+
33
+ // Resolve potential target and pattern string value
34
+ let resolved_value = resolve_value(&stmt.value, module, global_store);
35
+
36
+ // Build a map to store the pattern definition
37
+ let mut map = std::collections::HashMap::new();
38
+ map.insert("identifier".to_string(), Value::String(name.clone()));
39
+ if let Some(t) = target {
40
+ map.insert("target".to_string(), Value::String(t.clone()));
41
+ }
42
+ // Keep raw pattern in 'pattern' key
43
+ map.insert("pattern".to_string(), resolved_value.clone());
44
+
45
+ let resolved_stmt = Statement {
46
+ kind: StatementKind::Pattern {
47
+ name: name.clone(),
48
+ target: target.clone(),
49
+ },
50
+ value: resolved_value,
51
+ ..stmt.clone()
52
+ };
53
+
54
+ // Store into global variables as a Statement
55
+ global_store.variables.variables.insert(
56
+ name.clone(),
57
+ Value::Statement(Box::new(resolved_stmt.clone())),
58
+ );
59
+
60
+ return resolved_stmt;
61
+ }
62
+
63
+ logger.log_message(
64
+ LogLevel::Warning,
65
+ "resolve_pattern called on non-pattern statement",
66
+ );
67
+ stmt.clone()
68
+ }
69
+
70
+ fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore) -> Value {
71
+ // reuse driver::resolve_value logic; simple local resolution for pattern value
72
+ match value {
73
+ Value::String(s) => Value::String(s.clone()),
74
+ Value::Map(m) => {
75
+ let mut resolved = std::collections::HashMap::new();
76
+ for (k, v) in m {
77
+ resolved.insert(k.clone(), resolve_value(v, module, global_store));
78
+ }
79
+ Value::Map(resolved)
80
+ }
81
+ other => other.clone(),
82
+ }
83
+ }
@@ -1,99 +1,99 @@
1
- use crate::core::{
2
- parser::statement::{Statement, StatementKind},
3
- preprocessor::module::Module,
4
- store::global::GlobalStore,
5
- };
6
- use devalang_types::Value;
7
- use devalang_utils::logger::{LogLevel, Logger};
8
-
9
- pub fn resolve_spawn(
10
- stmt: &Statement,
11
- name: String,
12
- args: Vec<Value>,
13
- module: &Module,
14
- _path: &str,
15
- global_store: &mut GlobalStore,
16
- ) -> Statement {
17
- let logger = Logger::new();
18
-
19
- // If it's a function
20
- if let Some(func) = global_store.functions.functions.get(&name) {
21
- let mut resolved_map = std::collections::HashMap::new();
22
- resolved_map.insert("name".to_string(), Value::String(name.clone()));
23
- resolved_map.insert("args".to_string(), Value::Array(args.clone()));
24
- resolved_map.insert("body".to_string(), Value::Block(func.body.clone()));
25
-
26
- return Statement {
27
- kind: StatementKind::Spawn { name, args },
28
- value: Value::Map(resolved_map),
29
- ..stmt.clone()
30
- };
31
- }
32
-
33
- // If it's a group stored in variables
34
- if let Some(Value::Statement(stmt_box)) = global_store.variables.variables.get(&name) {
35
- if let StatementKind::Group = stmt_box.kind {
36
- if let Value::Map(map) = &stmt_box.value {
37
- if let Some(Value::Block(body)) = map.get("body") {
38
- let mut resolved_map = std::collections::HashMap::new();
39
- resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
40
- resolved_map.insert("args".to_string(), Value::Array(args.clone()));
41
- resolved_map.insert("body".to_string(), Value::Block(body.clone()));
42
-
43
- return Statement {
44
- kind: StatementKind::Spawn { name, args },
45
- value: Value::Map(resolved_map),
46
- ..stmt.clone()
47
- };
48
- }
49
- }
50
- }
51
- // Pattern case (make spawn accept patterns stored as variables)
52
- if let StatementKind::Pattern { .. } = stmt_box.kind {
53
- let mut resolved_map = std::collections::HashMap::new();
54
- resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
55
- // pattern value may be a string or a map stored on the statement
56
- match &stmt_box.value {
57
- Value::String(s) => {
58
- resolved_map.insert("pattern".to_string(), Value::String(s.clone()));
59
- }
60
- Value::Map(m) => {
61
- if let Some(val) = m.get("pattern") {
62
- resolved_map.insert("pattern".to_string(), val.clone());
63
- }
64
- if let Some(val) = m.get("target") {
65
- resolved_map.insert("target".to_string(), val.clone());
66
- }
67
- }
68
- _ => {}
69
- }
70
- resolved_map.insert("args".to_string(), Value::Array(args.clone()));
71
-
72
- return Statement {
73
- kind: StatementKind::Spawn { name, args },
74
- value: Value::Map(resolved_map),
75
- ..stmt.clone()
76
- };
77
- }
78
- }
79
-
80
- // Otherwise, log an error
81
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
82
- logger.log_message(
83
- LogLevel::Error,
84
- &format!(
85
- "Function or group '{}' not found for spawn\n → at {stacktrace}",
86
- name
87
- ),
88
- );
89
-
90
- Statement {
91
- kind: StatementKind::Error {
92
- message: format!("Function or group '{}' not found for spawn", name),
93
- },
94
- value: Value::Null,
95
- ..stmt.clone()
96
- }
97
- }
98
-
99
- // (removed unused helpers get_group_body, error_stmt)
1
+ use crate::core::{
2
+ parser::statement::{Statement, StatementKind},
3
+ preprocessor::module::Module,
4
+ store::global::GlobalStore,
5
+ };
6
+ use devalang_types::Value;
7
+ use devalang_utils::logger::{LogLevel, Logger};
8
+
9
+ pub fn resolve_spawn(
10
+ stmt: &Statement,
11
+ name: String,
12
+ args: Vec<Value>,
13
+ module: &Module,
14
+ _path: &str,
15
+ global_store: &mut GlobalStore,
16
+ ) -> Statement {
17
+ let logger = Logger::new();
18
+
19
+ // If it's a function
20
+ if let Some(func) = global_store.functions.functions.get(&name) {
21
+ let mut resolved_map = std::collections::HashMap::new();
22
+ resolved_map.insert("name".to_string(), Value::String(name.clone()));
23
+ resolved_map.insert("args".to_string(), Value::Array(args.clone()));
24
+ resolved_map.insert("body".to_string(), Value::Block(func.body.clone()));
25
+
26
+ return Statement {
27
+ kind: StatementKind::Spawn { name, args },
28
+ value: Value::Map(resolved_map),
29
+ ..stmt.clone()
30
+ };
31
+ }
32
+
33
+ // If it's a group stored in variables
34
+ if let Some(Value::Statement(stmt_box)) = global_store.variables.variables.get(&name) {
35
+ if let StatementKind::Group = stmt_box.kind {
36
+ if let Value::Map(map) = &stmt_box.value {
37
+ if let Some(Value::Block(body)) = map.get("body") {
38
+ let mut resolved_map = std::collections::HashMap::new();
39
+ resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
40
+ resolved_map.insert("args".to_string(), Value::Array(args.clone()));
41
+ resolved_map.insert("body".to_string(), Value::Block(body.clone()));
42
+
43
+ return Statement {
44
+ kind: StatementKind::Spawn { name, args },
45
+ value: Value::Map(resolved_map),
46
+ ..stmt.clone()
47
+ };
48
+ }
49
+ }
50
+ }
51
+ // Pattern case (make spawn accept patterns stored as variables)
52
+ if let StatementKind::Pattern { .. } = stmt_box.kind {
53
+ let mut resolved_map = std::collections::HashMap::new();
54
+ resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
55
+ // pattern value may be a string or a map stored on the statement
56
+ match &stmt_box.value {
57
+ Value::String(s) => {
58
+ resolved_map.insert("pattern".to_string(), Value::String(s.clone()));
59
+ }
60
+ Value::Map(m) => {
61
+ if let Some(val) = m.get("pattern") {
62
+ resolved_map.insert("pattern".to_string(), val.clone());
63
+ }
64
+ if let Some(val) = m.get("target") {
65
+ resolved_map.insert("target".to_string(), val.clone());
66
+ }
67
+ }
68
+ _ => {}
69
+ }
70
+ resolved_map.insert("args".to_string(), Value::Array(args.clone()));
71
+
72
+ return Statement {
73
+ kind: StatementKind::Spawn { name, args },
74
+ value: Value::Map(resolved_map),
75
+ ..stmt.clone()
76
+ };
77
+ }
78
+ }
79
+
80
+ // Otherwise, log an error
81
+ let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
82
+ logger.log_message(
83
+ LogLevel::Error,
84
+ &format!(
85
+ "Function or group '{}' not found for spawn\n → at {stacktrace}",
86
+ name
87
+ ),
88
+ );
89
+
90
+ Statement {
91
+ kind: StatementKind::Error {
92
+ message: format!("Function or group '{}' not found for spawn", name),
93
+ },
94
+ value: Value::Null,
95
+ ..stmt.clone()
96
+ }
97
+ }
98
+
99
+ // (removed unused helpers get_group_body, error_stmt)
@@ -1,54 +1,54 @@
1
- use crate::core::{
2
- parser::statement::{Statement, StatementKind},
3
- preprocessor::{module::Module, resolver::driver::resolve_statement},
4
- store::global::GlobalStore,
5
- };
6
- use devalang_types::Value;
7
- use devalang_utils::logger::{LogLevel, Logger};
8
-
9
- pub fn resolve_synth(
10
- stmt: &Statement,
11
- module: &Module,
12
- path: &str,
13
- global_store: &mut GlobalStore,
14
- ) -> Statement {
15
- let logger = Logger::new();
16
-
17
- let Value::Map(synth_map) = &stmt.value else {
18
- return type_error(
19
- &logger,
20
- module,
21
- stmt,
22
- "Expected a map in synth statement".to_string(),
23
- );
24
- };
25
-
26
- let mut resolved_map = synth_map.clone();
27
-
28
- if let Some(Value::Block(body)) = synth_map.get("body") {
29
- let resolved_body = body
30
- .iter()
31
- .map(|s| resolve_statement(s, module, path, global_store))
32
- .collect::<Vec<_>>();
33
- resolved_map.insert("body".to_string(), Value::Block(resolved_body));
34
- } else {
35
- logger.log_message(LogLevel::Warning, "synth without a body");
36
- }
37
-
38
- Statement {
39
- kind: StatementKind::Synth,
40
- value: Value::Map(resolved_map),
41
- ..stmt.clone()
42
- }
43
- }
44
-
45
- fn type_error(logger: &Logger, module: &Module, stmt: &Statement, message: String) -> Statement {
46
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
47
- logger.log_error_with_stacktrace(&message, &stacktrace);
48
-
49
- Statement {
50
- kind: StatementKind::Error { message },
51
- value: Value::Null,
52
- ..stmt.clone()
53
- }
54
- }
1
+ use crate::core::{
2
+ parser::statement::{Statement, StatementKind},
3
+ preprocessor::{module::Module, resolver::driver::resolve_statement},
4
+ store::global::GlobalStore,
5
+ };
6
+ use devalang_types::Value;
7
+ use devalang_utils::logger::{LogLevel, Logger};
8
+
9
+ pub fn resolve_synth(
10
+ stmt: &Statement,
11
+ module: &Module,
12
+ path: &str,
13
+ global_store: &mut GlobalStore,
14
+ ) -> Statement {
15
+ let logger = Logger::new();
16
+
17
+ let Value::Map(synth_map) = &stmt.value else {
18
+ return type_error(
19
+ &logger,
20
+ module,
21
+ stmt,
22
+ "Expected a map in synth statement".to_string(),
23
+ );
24
+ };
25
+
26
+ let mut resolved_map = synth_map.clone();
27
+
28
+ if let Some(Value::Block(body)) = synth_map.get("body") {
29
+ let resolved_body = body
30
+ .iter()
31
+ .map(|s| resolve_statement(s, module, path, global_store))
32
+ .collect::<Vec<_>>();
33
+ resolved_map.insert("body".to_string(), Value::Block(resolved_body));
34
+ } else {
35
+ logger.log_message(LogLevel::Warning, "synth without a body");
36
+ }
37
+
38
+ Statement {
39
+ kind: StatementKind::Synth,
40
+ value: Value::Map(resolved_map),
41
+ ..stmt.clone()
42
+ }
43
+ }
44
+
45
+ fn type_error(logger: &Logger, module: &Module, stmt: &Statement, message: String) -> Statement {
46
+ let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
47
+ logger.log_error_with_stacktrace(&message, &stacktrace);
48
+
49
+ Statement {
50
+ kind: StatementKind::Error { message },
51
+ value: Value::Null,
52
+ ..stmt.clone()
53
+ }
54
+ }
@@ -1,48 +1,48 @@
1
- use crate::core::{
2
- parser::statement::{Statement, StatementKind},
3
- preprocessor::module::Module,
4
- store::global::GlobalStore,
5
- };
6
- use devalang_types::Value;
7
- use devalang_utils::logger::Logger;
8
-
9
- pub fn resolve_tempo(
10
- stmt: &Statement,
11
- module: &Module,
12
- _path: &str,
13
- _global_store: &GlobalStore,
14
- ) -> Statement {
15
- let mut new_stmt = stmt.clone();
16
- let logger = Logger::new();
17
-
18
- match &stmt.value {
19
- Value::Identifier(ident) => {
20
- if let Some(val) = module.variable_table.get(ident) {
21
- new_stmt.value = val.clone();
22
- } else {
23
- let message = format!("Tempo identifier '{ident}' not found in variable table");
24
- logger.log_error_with_stacktrace(&message, &module.path);
25
- new_stmt.kind = StatementKind::Error { message };
26
- new_stmt.value = Value::Null;
27
- }
28
- }
29
-
30
- Value::Number(_) => {
31
- // Already resolved, no modification needed
32
- }
33
-
34
- other => {
35
- let message = format!(
36
- "Expected a number or identifier for tempo, found {:?}",
37
- other
38
- );
39
- logger.log_error_with_stacktrace(&message, &module.path);
40
- new_stmt.kind = StatementKind::Error {
41
- message: "Expected a number or identifier for tempo".to_string(),
42
- };
43
- new_stmt.value = Value::Null;
44
- }
45
- }
46
-
47
- new_stmt
48
- }
1
+ use crate::core::{
2
+ parser::statement::{Statement, StatementKind},
3
+ preprocessor::module::Module,
4
+ store::global::GlobalStore,
5
+ };
6
+ use devalang_types::Value;
7
+ use devalang_utils::logger::Logger;
8
+
9
+ pub fn resolve_tempo(
10
+ stmt: &Statement,
11
+ module: &Module,
12
+ _path: &str,
13
+ _global_store: &GlobalStore,
14
+ ) -> Statement {
15
+ let mut new_stmt = stmt.clone();
16
+ let logger = Logger::new();
17
+
18
+ match &stmt.value {
19
+ Value::Identifier(ident) => {
20
+ if let Some(val) = module.variable_table.get(ident) {
21
+ new_stmt.value = val.clone();
22
+ } else {
23
+ let message = format!("Tempo identifier '{ident}' not found in variable table");
24
+ logger.log_error_with_stacktrace(&message, &module.path);
25
+ new_stmt.kind = StatementKind::Error { message };
26
+ new_stmt.value = Value::Null;
27
+ }
28
+ }
29
+
30
+ Value::Number(_) => {
31
+ // Already resolved, no modification needed
32
+ }
33
+
34
+ other => {
35
+ let message = format!(
36
+ "Expected a number or identifier for tempo, found {:?}",
37
+ other
38
+ );
39
+ logger.log_error_with_stacktrace(&message, &module.path);
40
+ new_stmt.kind = StatementKind::Error {
41
+ message: "Expected a number or identifier for tempo".to_string(),
42
+ };
43
+ new_stmt.value = Value::Null;
44
+ }
45
+ }
46
+
47
+ new_stmt
48
+ }