@devaloop/devalang 0.0.1-alpha.15 → 0.0.1-alpha.16-hotfix.0

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 (173) hide show
  1. package/.devalang +2 -0
  2. package/.github/workflows/ci.yml +92 -0
  3. package/Cargo.toml +60 -58
  4. package/README.md +1 -1
  5. package/docs/CHANGELOG.md +34 -1
  6. package/docs/CONTRIBUTING.md +101 -1
  7. package/docs/ROADMAP.md +1 -1
  8. package/docs/TODO.md +1 -1
  9. package/examples/automation.deva +1 -3
  10. package/examples/bank.deva +4 -4
  11. package/examples/events.deva +12 -0
  12. package/examples/function.deva +4 -4
  13. package/examples/index.deva +3 -5
  14. package/examples/loop.deva +5 -11
  15. package/examples/pattern.deva +8 -0
  16. package/examples/plugin.deva +12 -11
  17. package/examples/variables.deva +1 -1
  18. package/out-tsc/bin/index.js +51 -7
  19. package/out-tsc/index.js +3 -1
  20. package/out-tsc/scripts/postbuild.js +9 -10
  21. package/out-tsc/scripts/postinstall.js +49 -0
  22. package/package.json +12 -4
  23. package/project-version.json +3 -3
  24. package/rust/cli/bank.rs +462 -455
  25. package/rust/cli/build.rs +252 -199
  26. package/rust/cli/check.rs +221 -180
  27. package/rust/cli/driver.rs +297 -292
  28. package/rust/cli/generator.rs +1 -0
  29. package/rust/cli/init.rs +87 -79
  30. package/rust/cli/install.rs +35 -32
  31. package/rust/cli/login.rs +127 -134
  32. package/rust/cli/mod.rs +13 -11
  33. package/rust/cli/play.rs +1123 -218
  34. package/rust/cli/telemetry.rs +19 -0
  35. package/rust/cli/template.rs +69 -57
  36. package/rust/cli/update.rs +6 -4
  37. package/rust/common/api.rs +5 -5
  38. package/rust/common/mod.rs +3 -3
  39. package/rust/config/driver.rs +118 -94
  40. package/rust/config/loader.rs +165 -156
  41. package/rust/config/mod.rs +4 -2
  42. package/rust/config/settings.rs +91 -0
  43. package/rust/config/stats.rs +257 -0
  44. package/rust/core/audio/engine.rs +696 -659
  45. package/rust/core/audio/evaluator.rs +263 -132
  46. package/rust/core/audio/interpreter/arrow_call.rs +198 -187
  47. package/rust/core/audio/interpreter/call.rs +98 -95
  48. package/rust/core/audio/interpreter/condition.rs +70 -71
  49. package/rust/core/audio/interpreter/driver.rs +487 -231
  50. package/rust/core/audio/interpreter/function.rs +26 -21
  51. package/rust/core/audio/interpreter/let_.rs +38 -26
  52. package/rust/core/audio/interpreter/load.rs +18 -18
  53. package/rust/core/audio/interpreter/loop_.rs +113 -106
  54. package/rust/core/audio/interpreter/mod.rs +14 -14
  55. package/rust/core/audio/interpreter/sleep.rs +27 -28
  56. package/rust/core/audio/interpreter/spawn.rs +105 -102
  57. package/rust/core/audio/interpreter/tempo.rs +19 -16
  58. package/rust/core/audio/interpreter/trigger.rs +239 -210
  59. package/rust/core/audio/loader/mod.rs +1 -1
  60. package/rust/core/audio/loader/trigger.rs +100 -94
  61. package/rust/core/audio/mod.rs +7 -7
  62. package/rust/core/audio/player.rs +64 -64
  63. package/rust/core/audio/renderer.rs +56 -53
  64. package/rust/core/audio/special/easing.rs +189 -120
  65. package/rust/core/audio/special/env.rs +43 -41
  66. package/rust/core/audio/special/math.rs +102 -92
  67. package/rust/core/audio/special/mod.rs +9 -9
  68. package/rust/core/audio/special/modulator.rs +143 -120
  69. package/rust/core/builder/mod.rs +80 -85
  70. package/rust/core/debugger/lexer.rs +27 -27
  71. package/rust/core/debugger/mod.rs +24 -23
  72. package/rust/core/debugger/module.rs +55 -47
  73. package/rust/core/debugger/preprocessor.rs +27 -27
  74. package/rust/core/debugger/store.rs +40 -39
  75. package/rust/core/error/mod.rs +80 -69
  76. package/rust/core/lexer/handler/arrow.rs +82 -82
  77. package/rust/core/lexer/handler/at.rs +21 -21
  78. package/rust/core/lexer/handler/brace.rs +41 -41
  79. package/rust/core/lexer/handler/colon.rs +21 -21
  80. package/rust/core/lexer/handler/comment.rs +30 -30
  81. package/rust/core/lexer/handler/dot.rs +21 -21
  82. package/rust/core/lexer/handler/driver.rs +337 -292
  83. package/rust/core/lexer/handler/identifier.rs +46 -43
  84. package/rust/core/lexer/handler/indent.rs +66 -66
  85. package/rust/core/lexer/handler/mod.rs +16 -16
  86. package/rust/core/lexer/handler/newline.rs +23 -23
  87. package/rust/core/lexer/handler/number.rs +31 -31
  88. package/rust/core/lexer/handler/operator.rs +46 -46
  89. package/rust/core/lexer/handler/parenthesis.rs +41 -41
  90. package/rust/core/lexer/handler/slash.rs +21 -21
  91. package/rust/core/lexer/handler/string.rs +63 -63
  92. package/rust/core/lexer/mod.rs +54 -51
  93. package/rust/core/lexer/token.rs +97 -94
  94. package/rust/core/mod.rs +11 -11
  95. package/rust/core/parser/driver.rs +513 -490
  96. package/rust/core/parser/handler/arrow_call.rs +233 -227
  97. package/rust/core/parser/handler/at.rs +245 -162
  98. package/rust/core/parser/handler/bank.rs +94 -69
  99. package/rust/core/parser/handler/condition.rs +80 -74
  100. package/rust/core/parser/handler/dot.rs +143 -135
  101. package/rust/core/parser/handler/identifier/automate.rs +257 -194
  102. package/rust/core/parser/handler/identifier/call.rs +91 -88
  103. package/rust/core/parser/handler/identifier/emit.rs +66 -0
  104. package/rust/core/parser/handler/identifier/function.rs +100 -91
  105. package/rust/core/parser/handler/identifier/group.rs +85 -75
  106. package/rust/core/parser/handler/identifier/let_.rs +158 -143
  107. package/rust/core/parser/handler/identifier/mod.rs +54 -56
  108. package/rust/core/parser/handler/identifier/on.rs +98 -0
  109. package/rust/core/parser/handler/identifier/print.rs +52 -29
  110. package/rust/core/parser/handler/identifier/sleep.rs +36 -33
  111. package/rust/core/parser/handler/identifier/spawn.rs +91 -88
  112. package/rust/core/parser/handler/identifier/synth.rs +65 -63
  113. package/rust/core/parser/handler/loop_.rs +170 -89
  114. package/rust/core/parser/handler/mod.rs +8 -8
  115. package/rust/core/parser/handler/tempo.rs +53 -47
  116. package/rust/core/parser/mod.rs +4 -4
  117. package/rust/core/parser/statement.rs +142 -113
  118. package/rust/core/plugin/loader.rs +123 -48
  119. package/rust/core/plugin/mod.rs +2 -1
  120. package/rust/core/plugin/runner.rs +296 -0
  121. package/rust/core/preprocessor/loader.rs +515 -326
  122. package/rust/core/preprocessor/mod.rs +4 -4
  123. package/rust/core/preprocessor/module.rs +60 -58
  124. package/rust/core/preprocessor/processor.rs +99 -101
  125. package/rust/core/preprocessor/resolver/bank.rs +51 -48
  126. package/rust/core/preprocessor/resolver/call.rs +100 -101
  127. package/rust/core/preprocessor/resolver/condition.rs +97 -97
  128. package/rust/core/preprocessor/resolver/driver.rs +310 -280
  129. package/rust/core/preprocessor/resolver/function.rs +69 -68
  130. package/rust/core/preprocessor/resolver/group.rs +96 -91
  131. package/rust/core/preprocessor/resolver/let_.rs +32 -28
  132. package/rust/core/preprocessor/resolver/loop_.rs +320 -121
  133. package/rust/core/preprocessor/resolver/mod.rs +15 -15
  134. package/rust/core/preprocessor/resolver/spawn.rs +76 -73
  135. package/rust/core/preprocessor/resolver/synth.rs +56 -50
  136. package/rust/core/preprocessor/resolver/tempo.rs +50 -49
  137. package/rust/core/preprocessor/resolver/trigger.rs +113 -115
  138. package/rust/core/preprocessor/resolver/value.rs +81 -81
  139. package/rust/core/shared/duration.rs +9 -9
  140. package/rust/core/shared/mod.rs +3 -3
  141. package/rust/core/shared/value.rs +35 -32
  142. package/rust/core/store/function.rs +34 -34
  143. package/rust/core/store/global.rs +55 -38
  144. package/rust/core/store/mod.rs +5 -5
  145. package/rust/core/store/variable.rs +37 -34
  146. package/rust/core/utils/mod.rs +2 -2
  147. package/rust/core/utils/path.rs +37 -31
  148. package/rust/core/utils/validation.rs +35 -36
  149. package/rust/installer/addon.rs +84 -80
  150. package/rust/installer/bank.rs +62 -65
  151. package/rust/installer/mod.rs +5 -5
  152. package/rust/installer/plugin.rs +54 -55
  153. package/rust/installer/utils.rs +56 -56
  154. package/rust/lib.rs +156 -164
  155. package/rust/main.rs +250 -144
  156. package/rust/utils/error.rs +200 -51
  157. package/rust/utils/file.rs +38 -35
  158. package/rust/utils/first_usage.rs +76 -0
  159. package/rust/utils/logger.rs +195 -143
  160. package/rust/utils/mod.rs +9 -7
  161. package/rust/utils/signature.rs +19 -17
  162. package/rust/utils/spinner.rs +22 -19
  163. package/rust/utils/telemetry.rs +292 -0
  164. package/rust/utils/watcher.rs +34 -33
  165. package/templates/minimal/README.md +97 -121
  166. package/templates/welcome/README.md +97 -121
  167. package/typescript/bin/index.ts +19 -5
  168. package/typescript/index.ts +3 -1
  169. package/typescript/scripts/postbuild.ts +10 -6
  170. package/typescript/scripts/postinstall.ts +56 -0
  171. package/typescript/scripts/version/bump.ts +0 -1
  172. package/typescript/scripts/version/index.ts +0 -1
  173. package/out-tsc/bin/devalang.exe +0 -0
@@ -1,4 +1,4 @@
1
- pub mod module;
2
- pub mod loader;
3
- pub mod resolver;
4
- pub mod processor;
1
+ pub mod loader;
2
+ pub mod module;
3
+ pub mod processor;
4
+ pub mod resolver;
@@ -1,58 +1,60 @@
1
- use crate::core::{
2
- lexer::token::Token,
3
- parser::statement::Statement,
4
- store::{ export::ExportTable, function::FunctionTable, import::ImportTable, variable::VariableTable },
5
- };
6
-
7
- #[derive(Debug, Clone)]
8
- pub struct Module {
9
- pub path: String,
10
- pub resolved: bool,
11
- pub tokens: Vec<Token>,
12
- pub statements: Vec<Statement>,
13
- pub variable_table: VariableTable,
14
- pub function_table: FunctionTable,
15
- pub export_table: ExportTable,
16
- pub import_table: ImportTable,
17
- pub content: String,
18
- pub current_dir: String,
19
- }
20
-
21
- impl Module {
22
- pub fn new(path: &str) -> Self {
23
- Module {
24
- path: path.to_string(),
25
- tokens: Vec::new(),
26
- statements: Vec::new(),
27
- variable_table: VariableTable::new(),
28
- function_table: FunctionTable::new(),
29
- export_table: ExportTable::new(),
30
- import_table: ImportTable::new(),
31
- resolved: false,
32
- content: String::new(),
33
- current_dir: String::new(),
34
- }
35
- }
36
-
37
- pub fn is_resolved(&self) -> bool {
38
- self.resolved
39
- }
40
-
41
- pub fn set_resolved(&mut self, resolved: bool) {
42
- self.resolved = resolved;
43
- }
44
-
45
- pub fn add_token(&mut self, token: Token) {
46
- self.tokens.push(token);
47
- }
48
-
49
- pub fn add_statement(&mut self, statement: Statement) {
50
- self.statements.push(statement);
51
- }
52
-
53
- pub fn from_existing(path: &str, content: String) -> Self {
54
- let mut module = Module::new(path);
55
- module.content = content;
56
- module
57
- }
58
- }
1
+ use crate::core::{
2
+ lexer::token::Token,
3
+ parser::statement::Statement,
4
+ store::{
5
+ export::ExportTable, function::FunctionTable, import::ImportTable, variable::VariableTable,
6
+ },
7
+ };
8
+
9
+ #[derive(Debug, Clone)]
10
+ pub struct Module {
11
+ pub path: String,
12
+ pub resolved: bool,
13
+ pub tokens: Vec<Token>,
14
+ pub statements: Vec<Statement>,
15
+ pub variable_table: VariableTable,
16
+ pub function_table: FunctionTable,
17
+ pub export_table: ExportTable,
18
+ pub import_table: ImportTable,
19
+ pub content: String,
20
+ pub current_dir: String,
21
+ }
22
+
23
+ impl Module {
24
+ pub fn new(path: &str) -> Self {
25
+ Module {
26
+ path: path.to_string(),
27
+ tokens: Vec::new(),
28
+ statements: Vec::new(),
29
+ variable_table: VariableTable::new(),
30
+ function_table: FunctionTable::new(),
31
+ export_table: ExportTable::new(),
32
+ import_table: ImportTable::new(),
33
+ resolved: false,
34
+ content: String::new(),
35
+ current_dir: String::new(),
36
+ }
37
+ }
38
+
39
+ pub fn is_resolved(&self) -> bool {
40
+ self.resolved
41
+ }
42
+
43
+ pub fn set_resolved(&mut self, resolved: bool) {
44
+ self.resolved = resolved;
45
+ }
46
+
47
+ pub fn add_token(&mut self, token: Token) {
48
+ self.tokens.push(token);
49
+ }
50
+
51
+ pub fn add_statement(&mut self, statement: Statement) {
52
+ self.statements.push(statement);
53
+ }
54
+
55
+ pub fn from_existing(path: &str, content: String) -> Self {
56
+ let mut module = Module::new(path);
57
+ module.content = content;
58
+ module
59
+ }
60
+ }
@@ -1,101 +1,99 @@
1
- use std::{ collections::HashMap, path::Path };
2
-
3
- use crate::core::{
4
- parser::statement::StatementKind,
5
- preprocessor::loader::ModuleLoader,
6
- shared::value::Value,
7
- store::global::GlobalStore,
8
- utils::path::{ normalize_path, resolve_relative_path },
9
- };
10
-
11
- pub fn process_modules(_module_loader: &ModuleLoader, global_store: &mut GlobalStore) {
12
- for module in global_store.modules.values_mut() {
13
- for stmt in &module.statements {
14
- match &stmt.kind {
15
- StatementKind::Let { name } => {
16
- if let Value::Null = stmt.value {
17
- eprintln!("❌ Variable '{}' is declared but not initialized.", name);
18
-
19
- module.variable_table.variables.insert(
20
- name.clone(),
21
- Value::StatementKind(Box::new(stmt.kind.clone()))
22
- );
23
-
24
- continue;
25
- }
26
-
27
- if module.variable_table.get(name).is_some() {
28
- eprintln!("❌ Variable '{}' is already defined in this scope.", name);
29
- continue;
30
- }
31
-
32
- if let Some(module_variable) = module.variable_table.variables.get(name) {
33
- eprintln!(
34
- "❌ Variable '{}' is already defined globally with value: {:?}",
35
- name,
36
- module_variable
37
- );
38
- continue;
39
- }
40
-
41
- module.variable_table.variables.insert(name.clone(), stmt.value.clone());
42
- }
43
-
44
- StatementKind::Load { source, alias } => {
45
- let module_dir = Path::new(&module.path).parent().unwrap_or(Path::new(""));
46
-
47
- let resolved_path = normalize_path(&module_dir.join(source));
48
-
49
- module.variable_table.variables.insert(
50
- alias.clone(),
51
- Value::Sample(resolved_path)
52
- );
53
- }
54
-
55
- StatementKind::Export { names, source: _ } => {
56
- for name in names {
57
- if let Some(val) = module.variable_table.get(name) {
58
- module.export_table.add_export(name.clone(), val.clone());
59
- }
60
- }
61
- }
62
-
63
- StatementKind::Import { names, source } => {
64
- let resolved = resolve_relative_path(&module.path, source);
65
- for name in names {
66
- module.import_table.add_import(
67
- name.clone(),
68
- Value::String(resolved.clone())
69
- );
70
- }
71
- }
72
-
73
- StatementKind::Group => {
74
- if let Value::Map(map) = &stmt.value {
75
- if
76
- let (Some(Value::String(name)), Some(Value::Block(body))) = (
77
- map.get("identifier"),
78
- map.get("body"),
79
- )
80
- {
81
- let mut stored_map = HashMap::new();
82
-
83
- stored_map.insert(
84
- "identifier".to_string(),
85
- Value::String(name.clone())
86
- );
87
-
88
- stored_map.insert("body".to_string(), Value::Block(body.clone()));
89
-
90
- module.variable_table.set(name.to_string(), Value::Map(stored_map));
91
- } else {
92
- eprintln!("❌ Invalid group definition: {:?}", stmt.value);
93
- }
94
- }
95
- }
96
-
97
- _ => {}
98
- }
99
- }
100
- }
101
- }
1
+ use std::{collections::HashMap, path::Path};
2
+
3
+ use crate::core::{
4
+ parser::statement::StatementKind,
5
+ preprocessor::loader::ModuleLoader,
6
+ shared::value::Value,
7
+ store::global::GlobalStore,
8
+ utils::path::{normalize_path, resolve_relative_path},
9
+ };
10
+
11
+ pub fn process_modules(_module_loader: &ModuleLoader, global_store: &mut GlobalStore) {
12
+ for module in global_store.modules.values_mut() {
13
+ for stmt in &module.statements {
14
+ match &stmt.kind {
15
+ StatementKind::Let { name } => {
16
+ if let Value::Null = stmt.value {
17
+ eprintln!("❌ Variable '{}' is declared but not initialized.", name);
18
+
19
+ module.variable_table.variables.insert(
20
+ name.clone(),
21
+ Value::StatementKind(Box::new(stmt.kind.clone())),
22
+ );
23
+
24
+ continue;
25
+ }
26
+
27
+ if module.variable_table.get(name).is_some() {
28
+ eprintln!("❌ Variable '{}' is already defined in this scope.", name);
29
+ continue;
30
+ }
31
+
32
+ if let Some(module_variable) = module.variable_table.variables.get(name) {
33
+ eprintln!(
34
+ "❌ Variable '{}' is already defined globally with value: {:?}",
35
+ name, module_variable
36
+ );
37
+ continue;
38
+ }
39
+
40
+ module
41
+ .variable_table
42
+ .variables
43
+ .insert(name.clone(), stmt.value.clone());
44
+ }
45
+
46
+ StatementKind::Load { source, alias } => {
47
+ let module_dir = Path::new(&module.path).parent().unwrap_or(Path::new(""));
48
+
49
+ let resolved_path = normalize_path(&module_dir.join(source));
50
+
51
+ module
52
+ .variable_table
53
+ .variables
54
+ .insert(alias.clone(), Value::Sample(resolved_path));
55
+ }
56
+
57
+ StatementKind::Export { names, source: _ } => {
58
+ for name in names {
59
+ if let Some(val) = module.variable_table.get(name) {
60
+ module.export_table.add_export(name.clone(), val.clone());
61
+ }
62
+ }
63
+ }
64
+
65
+ StatementKind::Import { names, source } => {
66
+ let resolved = resolve_relative_path(&module.path, source);
67
+ for name in names {
68
+ module
69
+ .import_table
70
+ .add_import(name.clone(), Value::String(resolved.clone()));
71
+ }
72
+ }
73
+
74
+ StatementKind::Group => {
75
+ if let Value::Map(map) = &stmt.value {
76
+ if let (Some(Value::String(name)), Some(Value::Block(body))) =
77
+ (map.get("identifier"), map.get("body"))
78
+ {
79
+ let mut stored_map = HashMap::new();
80
+
81
+ stored_map
82
+ .insert("identifier".to_string(), Value::String(name.clone()));
83
+
84
+ stored_map.insert("body".to_string(), Value::Block(body.clone()));
85
+
86
+ module
87
+ .variable_table
88
+ .set(name.to_string(), Value::Map(stored_map));
89
+ } else {
90
+ eprintln!("❌ Invalid group definition: {:?}", stmt.value);
91
+ }
92
+ }
93
+ }
94
+
95
+ _ => {}
96
+ }
97
+ }
98
+ }
99
+ }
@@ -1,48 +1,51 @@
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_bank(
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
- match &stmt.value {
20
- Value::Identifier(ident) => {
21
- if let Some(val) = module.variable_table.get(ident) {
22
- new_stmt.value = val.clone();
23
- } else {
24
- let message = format!("Bank identifier '{ident}' not found in variable table");
25
- logger.log_error_with_stacktrace(&message, &module.path);
26
- new_stmt.kind = StatementKind::Error {
27
- message: message.clone(),
28
- };
29
- new_stmt.value = Value::Null;
30
- }
31
- }
32
-
33
- Value::String(_) => {}
34
-
35
- Value::Number(_) => {}
36
-
37
- other => {
38
- let message = format!("Expected a string or identifier for bank, found {:?}", other);
39
- logger.log_error_with_stacktrace(&message, &module.path);
40
- new_stmt.kind = StatementKind::Error {
41
- message: "Expected a string or identifier for bank".to_string(),
42
- };
43
- new_stmt.value = Value::Null;
44
- }
45
- }
46
-
47
- new_stmt
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_bank(
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
+ match &stmt.value {
20
+ Value::Identifier(ident) => {
21
+ if let Some(val) = module.variable_table.get(ident) {
22
+ new_stmt.value = val.clone();
23
+ } else {
24
+ let message = format!("Bank identifier '{ident}' not found in variable table");
25
+ logger.log_error_with_stacktrace(&message, &module.path);
26
+ new_stmt.kind = StatementKind::Error {
27
+ message: message.clone(),
28
+ };
29
+ new_stmt.value = Value::Null;
30
+ }
31
+ }
32
+
33
+ Value::String(_) => {}
34
+
35
+ Value::Number(_) => {}
36
+
37
+ other => {
38
+ let message = format!(
39
+ "Expected a string or identifier for bank, found {:?}",
40
+ other
41
+ );
42
+ logger.log_error_with_stacktrace(&message, &module.path);
43
+ new_stmt.kind = StatementKind::Error {
44
+ message: "Expected a string or identifier for bank".to_string(),
45
+ };
46
+ new_stmt.value = Value::Null;
47
+ }
48
+ }
49
+
50
+ new_stmt
51
+ }
@@ -1,101 +1,100 @@
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, LogLevel },
9
- };
10
-
11
- pub fn resolve_call(
12
- stmt: &Statement,
13
- name: String,
14
- args: Vec<Value>,
15
- module: &Module,
16
- _path: &str,
17
- global_store: &mut GlobalStore
18
- ) -> Statement {
19
- let logger = Logger::new();
20
-
21
- match &stmt.kind {
22
- StatementKind::Call { .. } => {
23
- // Check if it's a function
24
- if let Some(func) = global_store.functions.functions.get(&name) {
25
- let mut call_map = std::collections::HashMap::new();
26
- call_map.insert("name".to_string(), Value::Identifier(name.clone()));
27
- call_map.insert(
28
- "parameters".to_string(),
29
- Value::Array(
30
- func.parameters
31
- .iter()
32
- .map(|p| Value::Identifier(p.clone()))
33
- .collect()
34
- )
35
- );
36
- call_map.insert("args".to_string(), Value::Array(args.clone()));
37
- call_map.insert("body".to_string(), Value::Block(func.body.clone()));
38
-
39
- return Statement {
40
- kind: StatementKind::Call { name, args },
41
- value: Value::Map(call_map),
42
- ..stmt.clone()
43
- };
44
- }
45
-
46
- // Otherwise, check if it's a variable (e.g. group)
47
- if let Some(variable) = global_store.variables.variables.get(&name) {
48
- if let Value::Statement(stmt_box) = variable {
49
- if let StatementKind::Group = stmt_box.kind {
50
- if let Value::Map(map) = &stmt_box.value {
51
- if let Some(Value::Block(body)) = map.get("body") {
52
- let mut resolved_map = std::collections::HashMap::new();
53
- resolved_map.insert(
54
- "identifier".to_string(),
55
- Value::String(name.clone())
56
- );
57
- resolved_map.insert("args".to_string(), Value::Array(args.clone()));
58
- resolved_map.insert("body".to_string(), Value::Block(body.clone()));
59
-
60
- return Statement {
61
- kind: StatementKind::Call { name, args },
62
- value: Value::Map(resolved_map),
63
- ..stmt.clone()
64
- };
65
- }
66
- }
67
- }
68
- }
69
- }
70
-
71
- // Otherwise, log an error
72
- logger.log_message(LogLevel::Error, &format!("Function or group '{}' not found", name));
73
- Statement {
74
- kind: StatementKind::Error {
75
- message: format!("Function or group '{}' not found", name),
76
- },
77
- value: Value::Null,
78
- ..stmt.clone()
79
- }
80
- }
81
- _ => {
82
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
83
- logger.log_message(
84
- LogLevel::Error,
85
- &format!(
86
- "Expected StatementKind::Call in resolve_call()\n → at {stacktrace}"
87
- )
88
- );
89
-
90
- Statement {
91
- kind: StatementKind::Error {
92
- message: "Expected StatementKind::Call in resolve_call()".to_string(),
93
- },
94
- value: Value::Null,
95
- ..stmt.clone()
96
- }
97
- },
98
- }
99
- }
100
-
101
- // (removed unused helpers get_group_body, error_stmt)
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::{LogLevel, Logger},
9
+ };
10
+
11
+ pub fn resolve_call(
12
+ stmt: &Statement,
13
+ name: String,
14
+ args: Vec<Value>,
15
+ module: &Module,
16
+ _path: &str,
17
+ global_store: &mut GlobalStore,
18
+ ) -> Statement {
19
+ let logger = Logger::new();
20
+
21
+ match &stmt.kind {
22
+ StatementKind::Call { .. } => {
23
+ // Check if it's a function
24
+ if let Some(func) = global_store.functions.functions.get(&name) {
25
+ let mut call_map = std::collections::HashMap::new();
26
+ call_map.insert("name".to_string(), Value::Identifier(name.clone()));
27
+ call_map.insert(
28
+ "parameters".to_string(),
29
+ Value::Array(
30
+ func.parameters
31
+ .iter()
32
+ .map(|p| Value::Identifier(p.clone()))
33
+ .collect(),
34
+ ),
35
+ );
36
+ call_map.insert("args".to_string(), Value::Array(args.clone()));
37
+ call_map.insert("body".to_string(), Value::Block(func.body.clone()));
38
+
39
+ return Statement {
40
+ kind: StatementKind::Call { name, args },
41
+ value: Value::Map(call_map),
42
+ ..stmt.clone()
43
+ };
44
+ }
45
+
46
+ // Otherwise, check if it's a variable (e.g. group)
47
+ if let Some(variable) = global_store.variables.variables.get(&name) {
48
+ if let Value::Statement(stmt_box) = variable {
49
+ if let StatementKind::Group = stmt_box.kind {
50
+ if let Value::Map(map) = &stmt_box.value {
51
+ if let Some(Value::Block(body)) = map.get("body") {
52
+ let mut resolved_map = std::collections::HashMap::new();
53
+ resolved_map
54
+ .insert("identifier".to_string(), Value::String(name.clone()));
55
+ resolved_map.insert("args".to_string(), Value::Array(args.clone()));
56
+ resolved_map.insert("body".to_string(), Value::Block(body.clone()));
57
+
58
+ return Statement {
59
+ kind: StatementKind::Call { name, args },
60
+ value: Value::Map(resolved_map),
61
+ ..stmt.clone()
62
+ };
63
+ }
64
+ }
65
+ }
66
+ }
67
+ }
68
+
69
+ // Otherwise, log an error
70
+ logger.log_message(
71
+ LogLevel::Error,
72
+ &format!("Function or group '{}' not found", name),
73
+ );
74
+ Statement {
75
+ kind: StatementKind::Error {
76
+ message: format!("Function or group '{}' not found", name),
77
+ },
78
+ value: Value::Null,
79
+ ..stmt.clone()
80
+ }
81
+ }
82
+ _ => {
83
+ let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
84
+ logger.log_message(
85
+ LogLevel::Error,
86
+ &format!("Expected StatementKind::Call in resolve_call()\n → at {stacktrace}"),
87
+ );
88
+
89
+ Statement {
90
+ kind: StatementKind::Error {
91
+ message: "Expected StatementKind::Call in resolve_call()".to_string(),
92
+ },
93
+ value: Value::Null,
94
+ ..stmt.clone()
95
+ }
96
+ }
97
+ }
98
+ }
99
+
100
+ // (removed unused helpers get_group_body, error_stmt)