@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
@@ -1,123 +1,124 @@
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::{ Logger, LogLevel },
9
- };
10
-
11
- pub fn resolve_call(
12
- stmt: &Statement,
13
- module: &Module,
14
- path: &str,
15
- global_store: &mut GlobalStore
16
- ) -> Statement {
17
- let logger = Logger::new();
18
-
19
- match &stmt.value {
20
- Value::Identifier(ident) => {
21
- match module.variable_table.get(ident) {
22
- Some(Value::String(group_name)) =>
23
- resolve_group_by_name(group_name, stmt, module, path, global_store, &logger),
24
- Some(Value::Map(group_map)) =>
25
- resolved_call(stmt, group_map, module, path, global_store),
26
- Some(other) =>
27
- error_stmt(
28
- &logger,
29
- module,
30
- stmt,
31
- &format!(
32
- "Identifier '{ident}' must resolve to a group name or map, found {:?}",
33
- other
34
- )
35
- ),
36
- None =>
37
- error_stmt(
38
- &logger,
39
- module,
40
- stmt,
41
- &format!("Identifier '{ident}' not found in variable table")
42
- ),
43
- }
44
- }
45
-
46
- Value::String(name) =>
47
- resolve_group_by_name(name, stmt, module, path, global_store, &logger),
48
-
49
- Value::Map(group_map) => resolved_call(stmt, group_map, module, path, global_store),
50
-
51
- other =>
52
- error_stmt(
53
- &logger,
54
- module,
55
- stmt,
56
- &format!("Call expects a group name as string or identifier, found {:?}", other)
57
- ),
58
- }
59
- }
60
-
61
- fn resolve_group_by_name(
62
- name: &str,
63
- stmt: &Statement,
64
- module: &Module,
65
- path: &str,
66
- global_store: &mut GlobalStore,
67
- logger: &Logger
68
- ) -> Statement {
69
- match module.variable_table.get(name) {
70
- Some(Value::Map(group_map)) => resolved_call(stmt, group_map, module, path, global_store),
71
- Some(other) =>
72
- error_stmt(
73
- logger,
74
- module,
75
- stmt,
76
- &format!("Expected a group for '{}', but found {:?}", name, other)
77
- ),
78
- None =>
79
- error_stmt(
80
- logger,
81
- module,
82
- stmt,
83
- &format!("Group '{}' not found in module '{}'", name, module.path)
84
- ),
85
- }
86
- }
87
-
88
- fn resolved_call(
89
- stmt: &Statement,
90
- group_map: &std::collections::HashMap<String, Value>,
91
- module: &Module,
92
- path: &str,
93
- global_store: &mut GlobalStore
94
- ) -> Statement {
95
- let mut cloned_map = group_map.clone();
96
-
97
- if let Some(Value::Block(stmts)) = group_map.get("body") {
98
- let resolved = stmts
99
- .iter()
100
- .map(|s| resolve_statement(s, module, path, global_store))
101
- .collect();
102
- cloned_map.insert("body".to_string(), Value::Block(resolved));
103
- }
104
-
105
- Statement {
106
- kind: StatementKind::Call,
107
- value: Value::Map(cloned_map),
108
- ..stmt.clone()
109
- }
110
- }
111
-
112
- fn error_stmt(logger: &Logger, module: &Module, stmt: &Statement, message: &str) -> Statement {
113
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
114
- logger.log_message(LogLevel::Error, &format!("{message}\n → at {stacktrace}"));
115
-
116
- Statement {
117
- kind: StatementKind::Error {
118
- message: message.to_string(),
119
- },
120
- value: Value::Null,
121
- ..stmt.clone()
122
- }
123
- }
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_call(
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
+ match &stmt.kind {
20
+ StatementKind::Call { .. } => {
21
+ // Check if it's a function
22
+ if let Some(func) = global_store.functions.functions.get(&name) {
23
+ let mut call_map = std::collections::HashMap::new();
24
+ call_map.insert("name".to_string(), Value::Identifier(name.clone()));
25
+ call_map.insert(
26
+ "parameters".to_string(),
27
+ Value::Array(
28
+ func.parameters
29
+ .iter()
30
+ .map(|p| Value::Identifier(p.clone()))
31
+ .collect(),
32
+ ),
33
+ );
34
+ call_map.insert("args".to_string(), Value::Array(args.clone()));
35
+ call_map.insert("body".to_string(), Value::Block(func.body.clone()));
36
+
37
+ return Statement {
38
+ kind: StatementKind::Call { name, args },
39
+ value: Value::Map(call_map),
40
+ ..stmt.clone()
41
+ };
42
+ }
43
+
44
+ // Otherwise, check if it's a variable (e.g. group)
45
+ if let Some(Value::Statement(stmt_box)) = global_store.variables.variables.get(&name) {
46
+ if let StatementKind::Group = stmt_box.kind {
47
+ if let Value::Map(map) = &stmt_box.value {
48
+ if let Some(Value::Block(body)) = map.get("body") {
49
+ let mut resolved_map = std::collections::HashMap::new();
50
+ resolved_map
51
+ .insert("identifier".to_string(), Value::String(name.clone()));
52
+ resolved_map.insert("args".to_string(), Value::Array(args.clone()));
53
+ resolved_map.insert("body".to_string(), Value::Block(body.clone()));
54
+
55
+ return Statement {
56
+ kind: StatementKind::Call { name, args },
57
+ value: Value::Map(resolved_map),
58
+ ..stmt.clone()
59
+ };
60
+ }
61
+ }
62
+ }
63
+ // Pattern case
64
+ if let StatementKind::Pattern { .. } = stmt_box.kind {
65
+ // pattern value may be a string or a map stored on the statement
66
+ let mut resolved_map = std::collections::HashMap::new();
67
+ resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
68
+ // pattern value
69
+ match &stmt_box.value {
70
+ Value::String(s) => {
71
+ resolved_map.insert("pattern".to_string(), Value::String(s.clone()));
72
+ }
73
+ Value::Map(m) => {
74
+ if let Some(val) = m.get("pattern") {
75
+ resolved_map.insert("pattern".to_string(), val.clone());
76
+ }
77
+ if let Some(val) = m.get("target") {
78
+ resolved_map.insert("target".to_string(), val.clone());
79
+ }
80
+ }
81
+ _ => {}
82
+ }
83
+ resolved_map.insert("args".to_string(), Value::Array(args.clone()));
84
+
85
+ return Statement {
86
+ kind: StatementKind::Call { name, args },
87
+ value: Value::Map(resolved_map),
88
+ ..stmt.clone()
89
+ };
90
+ }
91
+ }
92
+
93
+ // Otherwise, log an error
94
+ logger.log_message(
95
+ LogLevel::Error,
96
+ &format!("Function or group '{}' not found", name),
97
+ );
98
+ Statement {
99
+ kind: StatementKind::Error {
100
+ message: format!("Function or group '{}' not found", name),
101
+ },
102
+ value: Value::Null,
103
+ ..stmt.clone()
104
+ }
105
+ }
106
+ _ => {
107
+ let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
108
+ logger.log_message(
109
+ LogLevel::Error,
110
+ &format!("Expected StatementKind::Call in resolve_call()\n → at {stacktrace}"),
111
+ );
112
+
113
+ Statement {
114
+ kind: StatementKind::Error {
115
+ message: "Expected StatementKind::Call in resolve_call()".to_string(),
116
+ },
117
+ value: Value::Null,
118
+ ..stmt.clone()
119
+ }
120
+ }
121
+ }
122
+ }
123
+
124
+ // (removed unused helpers get_group_body, error_stmt)
@@ -1,92 +1,95 @@
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::Logger,
9
- };
10
-
11
- pub fn resolve_condition(
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(condition_map) = &stmt.value else {
20
- return type_error(&logger, module, stmt, "Expected a map in condition statement".to_string());
21
- };
22
-
23
- let mut resolved_map = condition_map.clone();
24
-
25
- // Main body resolution
26
- if let Some(Value::Block(body)) = condition_map.get("body") {
27
- let resolved_body = resolve_block_statements(body, module, path, global_store);
28
- resolved_map.insert("body".to_string(), Value::Block(resolved_body));
29
- }
30
-
31
- // Recursive resolution of next condition
32
- if let Some(Value::Map(next_map)) = condition_map.get("next") {
33
- let next_stmt = Statement {
34
- kind: StatementKind::If,
35
- value: Value::Map(next_map.clone()),
36
- ..stmt.clone()
37
- };
38
-
39
- let resolved_next = resolve_condition(&next_stmt, module, path, global_store);
40
-
41
- if let Value::Map(mut resolved_next_map) = resolved_next.value {
42
- // Body next resolution
43
- if let Some(Value::Block(body)) = resolved_next_map.get("body") {
44
- let resolved_body = resolve_block_statements(body, module, path, global_store);
45
- resolved_next_map.insert("body".to_string(), Value::Block(resolved_body));
46
- }
47
-
48
- resolved_map.insert("next".to_string(), Value::Map(resolved_next_map));
49
- }
50
- }
51
-
52
- Statement {
53
- kind: StatementKind::If,
54
- value: Value::Map(resolved_map),
55
- ..stmt.clone()
56
- }
57
- }
58
-
59
- fn resolve_block_statements(
60
- body: &[Statement],
61
- module: &Module,
62
- path: &str,
63
- global_store: &mut GlobalStore,
64
- ) -> Vec<Statement> {
65
- body.iter()
66
- .flat_map(|stmt| {
67
- let resolved = resolve_statement(stmt, module, path, global_store);
68
-
69
- if let StatementKind::Call = resolved.kind {
70
- if let Value::Block(inner) = &resolved.value {
71
- return inner
72
- .iter()
73
- .map(|s| resolve_statement(s, module, path, global_store))
74
- .collect();
75
- }
76
- }
77
-
78
- vec![resolved]
79
- })
80
- .collect()
81
- }
82
-
83
- fn type_error(logger: &Logger, module: &Module, stmt: &Statement, message: String) -> Statement {
84
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
85
- logger.log_error_with_stacktrace(&message, &stacktrace);
86
-
87
- Statement {
88
- kind: StatementKind::Error { message },
89
- value: Value::Null,
90
- ..stmt.clone()
91
- }
92
- }
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::Logger;
8
+
9
+ pub fn resolve_condition(
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(condition_map) = &stmt.value else {
18
+ return type_error(
19
+ &logger,
20
+ module,
21
+ stmt,
22
+ "Expected a map in condition statement".to_string(),
23
+ );
24
+ };
25
+
26
+ let mut resolved_map = condition_map.clone();
27
+
28
+ // Main body resolution
29
+ if let Some(Value::Block(body)) = condition_map.get("body") {
30
+ let resolved_body = resolve_block_statements(body, module, path, global_store);
31
+ resolved_map.insert("body".to_string(), Value::Block(resolved_body));
32
+ }
33
+
34
+ // Recursive resolution of next condition
35
+ if let Some(Value::Map(next_map)) = condition_map.get("next") {
36
+ let next_stmt = Statement {
37
+ kind: StatementKind::If,
38
+ value: Value::Map(next_map.clone()),
39
+ ..stmt.clone()
40
+ };
41
+
42
+ let resolved_next = resolve_condition(&next_stmt, module, path, global_store);
43
+
44
+ if let Value::Map(mut resolved_next_map) = resolved_next.value {
45
+ // Body next resolution
46
+ if let Some(Value::Block(body)) = resolved_next_map.get("body") {
47
+ let resolved_body = resolve_block_statements(body, module, path, global_store);
48
+ resolved_next_map.insert("body".to_string(), Value::Block(resolved_body));
49
+ }
50
+
51
+ resolved_map.insert("next".to_string(), Value::Map(resolved_next_map));
52
+ }
53
+ }
54
+
55
+ Statement {
56
+ kind: StatementKind::If,
57
+ value: Value::Map(resolved_map),
58
+ ..stmt.clone()
59
+ }
60
+ }
61
+
62
+ fn resolve_block_statements(
63
+ body: &[Statement],
64
+ module: &Module,
65
+ path: &str,
66
+ global_store: &mut GlobalStore,
67
+ ) -> Vec<Statement> {
68
+ body.iter()
69
+ .flat_map(|stmt| {
70
+ let resolved = resolve_statement(stmt, module, path, global_store);
71
+
72
+ if let StatementKind::Call { .. } = resolved.kind {
73
+ if let Value::Block(inner) = &resolved.value {
74
+ return inner
75
+ .iter()
76
+ .map(|s| resolve_statement(s, module, path, global_store))
77
+ .collect();
78
+ }
79
+ }
80
+
81
+ vec![resolved]
82
+ })
83
+ .collect()
84
+ }
85
+
86
+ fn type_error(logger: &Logger, module: &Module, stmt: &Statement, message: String) -> Statement {
87
+ let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
88
+ logger.log_error_with_stacktrace(&message, &stacktrace);
89
+
90
+ Statement {
91
+ kind: StatementKind::Error { message },
92
+ value: Value::Null,
93
+ ..stmt.clone()
94
+ }
95
+ }