@devaloop/devalang 0.0.1-alpha.9 → 0.0.1-beta.1

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 (271) hide show
  1. package/.cargo/config.toml +2 -0
  2. package/.devalang +10 -4
  3. package/.github/workflows/ci.yml +103 -0
  4. package/Cargo.toml +80 -48
  5. package/README.md +135 -154
  6. package/docs/CHANGELOG.md +386 -1
  7. package/docs/CONTRIBUTING.md +101 -0
  8. package/docs/ROADMAP.md +10 -7
  9. package/docs/TODO.md +21 -9
  10. package/examples/automation.deva +42 -0
  11. package/examples/bank.deva +7 -0
  12. package/examples/duration.deva +9 -0
  13. package/examples/events.deva +12 -0
  14. package/examples/function.deva +15 -0
  15. package/examples/index.deva +57 -12
  16. package/examples/loop.deva +5 -12
  17. package/examples/pattern.deva +8 -0
  18. package/examples/plugin.deva +16 -0
  19. package/examples/variables.deva +1 -1
  20. package/out-tsc/bin/index.d.ts +2 -0
  21. package/out-tsc/bin/index.js +51 -7
  22. package/out-tsc/core/functions/index.d.ts +37 -0
  23. package/out-tsc/core/functions/index.js +76 -0
  24. package/out-tsc/core/index.d.ts +6 -0
  25. package/out-tsc/core/index.js +22 -0
  26. package/out-tsc/core/types/index.d.ts +4 -0
  27. package/out-tsc/core/types/index.js +20 -0
  28. package/out-tsc/core/types/plugin.d.ts +18 -0
  29. package/out-tsc/core/types/plugin.js +2 -0
  30. package/out-tsc/core/types/result.d.ts +27 -0
  31. package/out-tsc/core/types/result.js +2 -0
  32. package/out-tsc/core/types/statement.d.ts +106 -0
  33. package/out-tsc/core/types/statement.js +2 -0
  34. package/out-tsc/core/types/value.d.ts +43 -0
  35. package/out-tsc/core/types/value.js +2 -0
  36. package/out-tsc/index.d.ts +7 -0
  37. package/out-tsc/index.js +42 -1
  38. package/out-tsc/pkg/devalang_core.d.ts +13 -0
  39. package/out-tsc/pkg/devalang_core.js +50 -0
  40. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +33 -0
  41. package/out-tsc/scripts/copy-wasm-dts.d.ts +1 -0
  42. package/out-tsc/scripts/copy-wasm-dts.js +73 -0
  43. package/out-tsc/scripts/postinstall.d.ts +1 -0
  44. package/out-tsc/scripts/postinstall.js +83 -0
  45. package/out-tsc/scripts/version/bump.d.ts +1 -0
  46. package/out-tsc/scripts/version/fetch.d.ts +1 -0
  47. package/out-tsc/scripts/version/index.d.ts +1 -0
  48. package/out-tsc/scripts/version/sync.d.ts +1 -0
  49. package/package.json +28 -7
  50. package/project-version.json +4 -4
  51. package/rust/cli/bank/api.rs +122 -0
  52. package/rust/cli/bank/commands.rs +275 -0
  53. package/rust/cli/bank/mod.rs +29 -0
  54. package/rust/cli/build/commands.rs +103 -0
  55. package/rust/cli/build/mod.rs +2 -0
  56. package/rust/cli/build/process.rs +146 -0
  57. package/rust/cli/check/mod.rs +208 -0
  58. package/rust/cli/discover/commands.rs +253 -0
  59. package/rust/cli/discover/config.rs +111 -0
  60. package/rust/cli/discover/fs.rs +19 -0
  61. package/rust/cli/discover/install.rs +103 -0
  62. package/rust/cli/discover/metadata.rs +48 -0
  63. package/rust/cli/discover/mod.rs +5 -0
  64. package/rust/cli/{init.rs → init/commands.rs} +32 -23
  65. package/rust/cli/init/mod.rs +1 -0
  66. package/rust/cli/install/addon.rs +118 -0
  67. package/rust/cli/install/bank.rs +53 -0
  68. package/rust/cli/install/commands.rs +35 -0
  69. package/rust/cli/install/mod.rs +4 -0
  70. package/rust/cli/install/plugin.rs +61 -0
  71. package/rust/cli/login/commands.rs +124 -0
  72. package/rust/cli/login/mod.rs +1 -0
  73. package/rust/cli/mod.rs +12 -205
  74. package/rust/cli/parser.rs +314 -0
  75. package/rust/cli/play/commands.rs +324 -0
  76. package/rust/cli/play/io.rs +17 -0
  77. package/rust/cli/play/mod.rs +5 -0
  78. package/rust/cli/play/process.rs +150 -0
  79. package/rust/cli/play/realtime.rs +91 -0
  80. package/rust/cli/play/utils.rs +23 -0
  81. package/rust/cli/telemetry/commands.rs +22 -0
  82. package/rust/cli/telemetry/event_creator.rs +80 -0
  83. package/rust/cli/telemetry/mod.rs +3 -0
  84. package/rust/cli/telemetry/send.rs +51 -0
  85. package/rust/cli/{template.rs → template/commands.rs} +69 -57
  86. package/rust/cli/template/mod.rs +1 -0
  87. package/rust/cli/update/commands.rs +6 -0
  88. package/rust/cli/update/mod.rs +1 -0
  89. package/rust/config/driver.rs +103 -0
  90. package/rust/config/mod.rs +3 -16
  91. package/rust/config/ops.rs +26 -0
  92. package/rust/config/settings.rs +101 -0
  93. package/rust/core/audio/engine/helpers.rs +170 -0
  94. package/rust/core/audio/engine/mod.rs +7 -0
  95. package/rust/core/audio/engine/sample.rs +366 -0
  96. package/rust/core/audio/engine/synth.rs +325 -0
  97. package/rust/core/audio/evaluator.rs +310 -31
  98. package/rust/core/audio/interpreter/arrow_call.rs +311 -129
  99. package/rust/core/audio/interpreter/automate.rs +18 -0
  100. package/rust/core/audio/interpreter/call.rs +294 -64
  101. package/rust/core/audio/interpreter/condition.rs +71 -69
  102. package/rust/core/audio/interpreter/driver.rs +542 -216
  103. package/rust/core/audio/interpreter/function.rs +26 -0
  104. package/rust/core/audio/interpreter/let_.rs +38 -19
  105. package/rust/core/audio/interpreter/load.rs +19 -18
  106. package/rust/core/audio/interpreter/loop_.rs +114 -67
  107. package/rust/core/audio/interpreter/mod.rs +14 -12
  108. package/rust/core/audio/interpreter/sleep.rs +28 -36
  109. package/rust/core/audio/interpreter/spawn.rs +252 -66
  110. package/rust/core/audio/interpreter/tempo.rs +40 -16
  111. package/rust/core/audio/interpreter/trigger.rs +239 -69
  112. package/rust/core/audio/loader/mod.rs +1 -1
  113. package/rust/core/audio/loader/trigger.rs +97 -52
  114. package/rust/core/audio/mod.rs +7 -6
  115. package/rust/core/audio/player.rs +70 -54
  116. package/rust/core/audio/renderer.rs +54 -54
  117. package/rust/core/audio/special/easing.rs +189 -0
  118. package/rust/core/audio/special/env.rs +45 -0
  119. package/rust/core/audio/special/math.rs +134 -0
  120. package/rust/core/audio/special/mod.rs +9 -0
  121. package/rust/core/audio/special/modulator.rs +143 -0
  122. package/rust/core/builder/mod.rs +86 -80
  123. package/rust/core/debugger/lexer.rs +27 -27
  124. package/rust/core/debugger/mod.rs +30 -21
  125. package/rust/core/debugger/module.rs +55 -0
  126. package/rust/core/debugger/preprocessor.rs +27 -27
  127. package/rust/core/debugger/store.rs +40 -25
  128. package/rust/core/error/mod.rs +269 -60
  129. package/rust/core/lexer/driver.rs +61 -0
  130. package/rust/core/lexer/handler/arrow.rs +82 -31
  131. package/rust/core/lexer/handler/at.rs +21 -21
  132. package/rust/core/lexer/handler/brace.rs +41 -41
  133. package/rust/core/lexer/handler/colon.rs +21 -21
  134. package/rust/core/lexer/handler/comment.rs +30 -30
  135. package/rust/core/lexer/handler/dot.rs +21 -21
  136. package/rust/core/lexer/handler/driver.rs +337 -226
  137. package/rust/core/lexer/handler/identifier.rs +47 -41
  138. package/rust/core/lexer/handler/indent.rs +66 -52
  139. package/rust/core/lexer/handler/mod.rs +15 -14
  140. package/rust/core/lexer/handler/newline.rs +23 -23
  141. package/rust/core/lexer/handler/number.rs +31 -31
  142. package/rust/core/lexer/handler/operator.rs +46 -44
  143. package/rust/core/lexer/handler/parenthesis.rs +41 -0
  144. package/rust/core/lexer/handler/slash.rs +21 -0
  145. package/rust/core/lexer/handler/string.rs +63 -63
  146. package/rust/core/lexer/mod.rs +3 -51
  147. package/rust/core/lexer/token.rs +17 -12
  148. package/rust/core/mod.rs +10 -10
  149. package/rust/core/parser/driver.rs +584 -331
  150. package/rust/core/parser/handler/arrow_call.rs +253 -126
  151. package/rust/core/parser/handler/at.rs +279 -162
  152. package/rust/core/parser/handler/bank.rs +104 -41
  153. package/rust/core/parser/handler/condition.rs +83 -74
  154. package/rust/core/parser/handler/dot.rs +148 -112
  155. package/rust/core/parser/handler/identifier/automate.rs +254 -0
  156. package/rust/core/parser/handler/identifier/call.rs +91 -41
  157. package/rust/core/parser/handler/identifier/emit.rs +70 -0
  158. package/rust/core/parser/handler/identifier/function.rs +113 -0
  159. package/rust/core/parser/handler/identifier/group.rs +89 -75
  160. package/rust/core/parser/handler/identifier/let_.rs +173 -133
  161. package/rust/core/parser/handler/identifier/mod.rs +55 -51
  162. package/rust/core/parser/handler/identifier/on.rs +107 -0
  163. package/rust/core/parser/handler/identifier/print.rs +49 -0
  164. package/rust/core/parser/handler/identifier/sleep.rs +43 -33
  165. package/rust/core/parser/handler/identifier/spawn.rs +91 -41
  166. package/rust/core/parser/handler/identifier/synth.rs +135 -65
  167. package/rust/core/parser/handler/loop_.rs +194 -72
  168. package/rust/core/parser/handler/mod.rs +9 -8
  169. package/rust/core/parser/handler/pattern.rs +74 -0
  170. package/rust/core/parser/handler/tempo.rs +57 -47
  171. package/rust/core/parser/mod.rs +3 -4
  172. package/rust/core/parser/statement.rs +11 -96
  173. package/rust/core/plugin/loader.rs +137 -0
  174. package/rust/core/plugin/mod.rs +2 -0
  175. package/rust/core/plugin/runner.rs +347 -0
  176. package/rust/core/preprocessor/loader.rs +637 -193
  177. package/rust/core/preprocessor/mod.rs +4 -4
  178. package/rust/core/preprocessor/module.rs +60 -50
  179. package/rust/core/preprocessor/processor.rs +114 -76
  180. package/rust/core/preprocessor/resolver/bank.rs +49 -47
  181. package/rust/core/preprocessor/resolver/call.rs +124 -123
  182. package/rust/core/preprocessor/resolver/condition.rs +95 -92
  183. package/rust/core/preprocessor/resolver/driver.rs +324 -227
  184. package/rust/core/preprocessor/resolver/function.rs +69 -0
  185. package/rust/core/preprocessor/resolver/group.rs +94 -61
  186. package/rust/core/preprocessor/resolver/let_.rs +32 -31
  187. package/rust/core/preprocessor/resolver/loop_.rs +318 -91
  188. package/rust/core/preprocessor/resolver/mod.rs +16 -14
  189. package/rust/core/preprocessor/resolver/pattern.rs +83 -0
  190. package/rust/core/preprocessor/resolver/spawn.rs +99 -58
  191. package/rust/core/preprocessor/resolver/synth.rs +54 -50
  192. package/rust/core/preprocessor/resolver/tempo.rs +48 -49
  193. package/rust/core/preprocessor/resolver/trigger.rs +116 -112
  194. package/rust/core/preprocessor/resolver/value.rs +176 -78
  195. package/rust/core/store/export.rs +28 -28
  196. package/rust/core/store/function.rs +40 -0
  197. package/rust/core/store/global.rs +61 -39
  198. package/rust/core/store/import.rs +28 -28
  199. package/rust/core/store/mod.rs +5 -4
  200. package/rust/core/store/variable.rs +51 -28
  201. package/rust/core/utils/mod.rs +1 -2
  202. package/rust/core/utils/path.rs +37 -31
  203. package/rust/lib.rs +308 -117
  204. package/rust/main.rs +364 -65
  205. package/rust/types/Cargo.toml +11 -0
  206. package/rust/types/src/addons.rs +55 -0
  207. package/rust/types/src/ast.rs +202 -0
  208. package/rust/types/src/config.rs +74 -0
  209. package/rust/types/src/lib.rs +12 -0
  210. package/rust/types/src/telemetry.rs +85 -0
  211. package/rust/utils/Cargo.toml +26 -0
  212. package/rust/utils/src/error.rs +186 -0
  213. package/rust/utils/src/file.rs +94 -0
  214. package/rust/utils/src/first_usage.rs +97 -0
  215. package/rust/utils/{mod.rs → src/lib.rs} +9 -6
  216. package/rust/utils/{logger.rs → src/logger.rs} +200 -123
  217. package/rust/utils/src/path.rs +88 -0
  218. package/rust/utils/src/signature.rs +41 -0
  219. package/rust/utils/{spinner.rs → src/spinner.rs} +20 -21
  220. package/rust/utils/src/version.rs +27 -0
  221. package/rust/utils/{watcher.rs → src/watcher.rs} +46 -33
  222. package/rust/web/api.rs +5 -0
  223. package/rust/web/cdn.rs +34 -0
  224. package/rust/web/mod.rs +3 -0
  225. package/rust/web/sso.rs +5 -0
  226. package/templates/minimal/README.md +143 -127
  227. package/templates/welcome/README.md +143 -127
  228. package/templates/welcome/src/index.deva +56 -8
  229. package/templates/welcome/src/variables.deva +2 -4
  230. package/tests/integration.rs +21 -0
  231. package/tests/rust/cli_check_build.rs +21 -0
  232. package/tests/rust/cli_help.rs +12 -0
  233. package/tests/rust/cli_template_list.rs +10 -0
  234. package/tests/rust/cli_version.rs +11 -0
  235. package/tests/typescript/index.spec.ts +136 -0
  236. package/tests/typescript/playhead.spec.ts +36 -0
  237. package/tests/typescript/render_e2e.spec.ts +77 -0
  238. package/tsconfig.json +12 -10
  239. package/typescript/bin/index.ts +19 -5
  240. package/typescript/core/functions/index.ts +83 -0
  241. package/typescript/core/index.ts +6 -0
  242. package/typescript/core/types/index.ts +4 -0
  243. package/typescript/core/types/plugin.ts +19 -0
  244. package/typescript/core/types/result.ts +29 -0
  245. package/typescript/core/types/statement.ts +47 -0
  246. package/typescript/core/types/value.ts +29 -0
  247. package/typescript/index.ts +8 -1
  248. package/typescript/pkg/devalang_core.d.ts +4 -0
  249. package/typescript/pkg/devalang_core.ts +49 -0
  250. package/typescript/scripts/copy-wasm-dts.ts +41 -0
  251. package/typescript/scripts/postinstall.ts +85 -0
  252. package/typescript/scripts/version/bump.ts +0 -1
  253. package/typescript/scripts/version/index.ts +0 -1
  254. package/docs/COMMANDS.md +0 -85
  255. package/docs/CONFIG.md +0 -30
  256. package/docs/SYNTAX.md +0 -210
  257. package/out-tsc/bin/devalang.exe +0 -0
  258. package/out-tsc/scripts/postbuild.js +0 -11
  259. package/rust/cli/build.rs +0 -137
  260. package/rust/cli/check.rs +0 -117
  261. package/rust/cli/play.rs +0 -193
  262. package/rust/config/loader.rs +0 -13
  263. package/rust/core/audio/engine.rs +0 -203
  264. package/rust/core/shared/duration.rs +0 -8
  265. package/rust/core/shared/mod.rs +0 -2
  266. package/rust/core/shared/value.rs +0 -18
  267. package/rust/core/utils/validation.rs +0 -37
  268. package/rust/utils/file.rs +0 -35
  269. package/rust/utils/signature.rs +0 -17
  270. package/rust/utils/version.rs +0 -15
  271. package/typescript/scripts/postbuild.ts +0 -8
@@ -0,0 +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,58 +1,99 @@
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
- module: &Module,
18
- path: &str,
19
- global_store: &mut GlobalStore
20
- ) -> Statement {
21
- let logger = Logger::new();
22
-
23
- let resolved_value = resolve_value(&stmt.value, module, global_store);
24
-
25
- match resolved_value {
26
- Value::Map(mut map) => {
27
- if let Some(Value::Block(stmts)) = map.get("body") {
28
- let resolved_block = stmts
29
- .iter()
30
- .map(|s| resolve_statement(s, module, path, global_store))
31
- .collect();
32
- map.insert("body".to_string(), Value::Block(resolved_block));
33
- }
34
-
35
- Statement {
36
- kind: StatementKind::Spawn,
37
- value: Value::Map(map),
38
- ..stmt.clone()
39
- }
40
- }
41
-
42
- _ => {
43
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
44
- logger.log_message(
45
- LogLevel::Error,
46
- &format!("Expected a map in spawn statement\n → at {stacktrace}")
47
- );
48
-
49
- Statement {
50
- kind: StatementKind::Error {
51
- message: "Invalid spawn value".to_string(),
52
- },
53
- value: Value::Null,
54
- ..stmt.clone()
55
- }
56
- }
57
- }
58
- }
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,50 +1,54 @@
1
- use crate::{
2
- core::{
3
- parser::statement::{ Statement, StatementKind },
4
- preprocessor::{ module::Module, resolver::driver::resolve_statement },
5
- shared::value::Value,
6
- store::global::GlobalStore,
7
- },
8
- utils::logger::{ LogLevel, Logger },
9
- };
10
-
11
- pub fn resolve_synth(
12
- stmt: &Statement,
13
- module: &Module,
14
- path: &str,
15
- global_store: &mut GlobalStore
16
- ) -> Statement {
17
- let logger = Logger::new();
18
-
19
- let Value::Map(synth_map) = &stmt.value else {
20
- return type_error(&logger, module, stmt, "Expected a map in synth statement".to_string());
21
- };
22
-
23
- let mut resolved_map = synth_map.clone();
24
-
25
- if let Some(Value::Block(body)) = synth_map.get("body") {
26
- let resolved_body = body.iter()
27
- .map(|s| resolve_statement(s, module, path, global_store))
28
- .collect::<Vec<_>>();
29
- resolved_map.insert("body".to_string(), Value::Block(resolved_body));
30
- } else {
31
- logger.log_message(LogLevel::Warning, "synth without a body");
32
- }
33
-
34
- Statement {
35
- kind: StatementKind::Synth,
36
- value: Value::Map(resolved_map),
37
- ..stmt.clone()
38
- }
39
- }
40
-
41
- fn type_error(logger: &Logger, module: &Module, stmt: &Statement, message: String) -> Statement {
42
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
43
- logger.log_error_with_stacktrace(&message, &stacktrace);
44
-
45
- Statement {
46
- kind: StatementKind::Error { message },
47
- value: Value::Null,
48
- ..stmt.clone()
49
- }
50
- }
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,49 +1,48 @@
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::Logger,
9
- };
10
-
11
- pub fn resolve_tempo(
12
- stmt: &Statement,
13
- module: &Module,
14
- path: &str,
15
- _global_store: &GlobalStore
16
- ) -> Statement {
17
- let mut new_stmt = stmt.clone();
18
- let logger = Logger::new();
19
-
20
- match &stmt.value {
21
- Value::Identifier(ident) => {
22
- if let Some(val) = module.variable_table.get(ident) {
23
- new_stmt.value = val.clone();
24
- } else {
25
- let message = format!("Tempo identifier '{ident}' not found in variable table");
26
- logger.log_error_with_stacktrace(&message, &module.path);
27
- new_stmt.kind = StatementKind::Error {
28
- message,
29
- };
30
- new_stmt.value = Value::Null;
31
- }
32
- }
33
-
34
- Value::Number(_) => {
35
- // Already resolved, no modification needed
36
- }
37
-
38
- other => {
39
- let message = format!("Expected a number or identifier for tempo, found {:?}", other);
40
- logger.log_error_with_stacktrace(&message, &module.path);
41
- new_stmt.kind = StatementKind::Error {
42
- message: "Expected a number or identifier for tempo".to_string(),
43
- };
44
- new_stmt.value = Value::Null;
45
- }
46
- }
47
-
48
- new_stmt
49
- }
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
+ }