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