@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,12 +1,10 @@
1
- use std::{collections::HashMap, path::Path};
2
-
3
1
  use crate::core::{
4
- parser::statement::StatementKind,
5
- preprocessor::loader::ModuleLoader,
2
+ parser::statement::StatementKind, preprocessor::loader::ModuleLoader,
6
3
  store::global::GlobalStore,
7
- utils::path::{normalize_path, resolve_relative_path},
8
4
  };
9
5
  use devalang_types::Value;
6
+ use devalang_utils::path::{normalize_path, resolve_relative_path};
7
+ use std::collections::HashMap;
10
8
 
11
9
  pub fn process_modules(_module_loader: &ModuleLoader, global_store: &mut GlobalStore) {
12
10
  for module in global_store.modules.values_mut() {
@@ -21,12 +19,10 @@ pub fn process_modules(_module_loader: &ModuleLoader, global_store: &mut GlobalS
21
19
  LogLevel::Error,
22
20
  &format!("Variable '{}' is declared but not initialized.", name),
23
21
  );
24
-
25
22
  module.variable_table.variables.insert(
26
23
  name.clone(),
27
24
  Value::StatementKind(Box::new(stmt.kind.clone())),
28
25
  );
29
-
30
26
  continue;
31
27
  }
32
28
 
@@ -56,10 +52,10 @@ pub fn process_modules(_module_loader: &ModuleLoader, global_store: &mut GlobalS
56
52
  }
57
53
 
58
54
  StatementKind::Load { source, alias } => {
59
- let module_dir = Path::new(&module.path).parent().unwrap_or(Path::new(""));
60
-
55
+ let module_dir = std::path::Path::new(&module.path)
56
+ .parent()
57
+ .unwrap_or(std::path::Path::new(""));
61
58
  let resolved_path = normalize_path(module_dir.join(source));
62
-
63
59
  module
64
60
  .variable_table
65
61
  .variables
@@ -89,12 +85,9 @@ pub fn process_modules(_module_loader: &ModuleLoader, global_store: &mut GlobalS
89
85
  (map.get("identifier"), map.get("body"))
90
86
  {
91
87
  let mut stored_map = HashMap::new();
92
-
93
88
  stored_map
94
89
  .insert("identifier".to_string(), Value::String(name.clone()));
95
-
96
90
  stored_map.insert("body".to_string(), Value::Block(body.clone()));
97
-
98
91
  module
99
92
  .variable_table
100
93
  .set(name.to_string(), Value::Map(stored_map));
@@ -0,0 +1 @@
1
+ pub mod handlers;
@@ -1,49 +1,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_bank(
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
- match &stmt.value {
18
- Value::Identifier(ident) => {
19
- if let Some(val) = module.variable_table.get(ident) {
20
- new_stmt.value = val.clone();
21
- } else {
22
- let message = format!("Bank identifier '{ident}' not found in variable table");
23
- logger.log_error_with_stacktrace(&message, &module.path);
24
- new_stmt.kind = StatementKind::Error {
25
- message: message.clone(),
26
- };
27
- new_stmt.value = Value::Null;
28
- }
29
- }
30
-
31
- Value::String(_) => {}
32
-
33
- Value::Number(_) => {}
34
-
35
- other => {
36
- let message = format!(
37
- "Expected a string or identifier for bank, found {:?}",
38
- other
39
- );
40
- logger.log_error_with_stacktrace(&message, &module.path);
41
- new_stmt.kind = StatementKind::Error {
42
- message: "Expected a string or identifier for bank".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_bank(
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
+ match &stmt.value {
18
+ Value::Identifier(ident) => {
19
+ if let Some(val) = module.variable_table.get(ident) {
20
+ new_stmt.value = val.clone();
21
+ } else {
22
+ let message = format!("Bank identifier '{ident}' not found in variable table");
23
+ logger.log_error_with_stacktrace(&message, &module.path);
24
+ new_stmt.kind = StatementKind::Error {
25
+ message: message.clone(),
26
+ };
27
+ new_stmt.value = Value::Null;
28
+ }
29
+ }
30
+
31
+ Value::String(_) => {}
32
+
33
+ Value::Number(_) => {}
34
+
35
+ other => {
36
+ let message = format!(
37
+ "Expected a string or identifier for bank, found {:?}",
38
+ other
39
+ );
40
+ logger.log_error_with_stacktrace(&message, &module.path);
41
+ new_stmt.kind = StatementKind::Error {
42
+ message: "Expected a string or identifier for bank".to_string(),
43
+ };
44
+ new_stmt.value = Value::Null;
45
+ }
46
+ }
47
+
48
+ new_stmt
49
+ }
@@ -1,124 +1,124 @@
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
+ 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,95 +1,95 @@
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
- }
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
+ }