@devaloop/devalang 0.0.1-alpha.14 → 0.0.1-alpha.16

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 (177) hide show
  1. package/.devalang +10 -8
  2. package/.github/workflows/ci.yml +92 -0
  3. package/Cargo.toml +60 -58
  4. package/README.md +32 -15
  5. package/docs/CHANGELOG.md +93 -1
  6. package/docs/CONTRIBUTING.md +101 -1
  7. package/docs/ROADMAP.md +2 -2
  8. package/docs/TODO.md +1 -1
  9. package/examples/automation.deva +42 -0
  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 +39 -25
  14. package/examples/loop.deva +5 -11
  15. package/examples/pattern.deva +8 -0
  16. package/examples/plugin.deva +16 -0
  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 -456
  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 -8
  38. package/rust/common/cdn.rs +3 -6
  39. package/rust/common/mod.rs +3 -3
  40. package/rust/common/sso.rs +3 -6
  41. package/rust/config/driver.rs +118 -94
  42. package/rust/config/loader.rs +165 -156
  43. package/rust/config/mod.rs +4 -2
  44. package/rust/config/settings.rs +91 -0
  45. package/rust/config/stats.rs +257 -0
  46. package/rust/core/audio/engine.rs +696 -518
  47. package/rust/core/audio/evaluator.rs +263 -31
  48. package/rust/core/audio/interpreter/arrow_call.rs +198 -161
  49. package/rust/core/audio/interpreter/automate.rs +18 -0
  50. package/rust/core/audio/interpreter/call.rs +98 -95
  51. package/rust/core/audio/interpreter/condition.rs +70 -71
  52. package/rust/core/audio/interpreter/driver.rs +487 -198
  53. package/rust/core/audio/interpreter/function.rs +26 -21
  54. package/rust/core/audio/interpreter/let_.rs +38 -19
  55. package/rust/core/audio/interpreter/load.rs +18 -18
  56. package/rust/core/audio/interpreter/loop_.rs +113 -73
  57. package/rust/core/audio/interpreter/mod.rs +14 -13
  58. package/rust/core/audio/interpreter/sleep.rs +27 -30
  59. package/rust/core/audio/interpreter/spawn.rs +105 -102
  60. package/rust/core/audio/interpreter/tempo.rs +19 -16
  61. package/rust/core/audio/interpreter/trigger.rs +239 -210
  62. package/rust/core/audio/loader/mod.rs +1 -1
  63. package/rust/core/audio/loader/trigger.rs +100 -97
  64. package/rust/core/audio/mod.rs +7 -6
  65. package/rust/core/audio/player.rs +64 -64
  66. package/rust/core/audio/renderer.rs +56 -53
  67. package/rust/core/audio/special/easing.rs +189 -0
  68. package/rust/core/audio/special/env.rs +43 -0
  69. package/rust/core/audio/special/math.rs +102 -0
  70. package/rust/core/audio/special/mod.rs +9 -0
  71. package/rust/core/audio/special/modulator.rs +143 -0
  72. package/rust/core/builder/mod.rs +80 -85
  73. package/rust/core/debugger/lexer.rs +27 -27
  74. package/rust/core/debugger/mod.rs +24 -23
  75. package/rust/core/debugger/module.rs +55 -47
  76. package/rust/core/debugger/preprocessor.rs +27 -27
  77. package/rust/core/debugger/store.rs +40 -39
  78. package/rust/core/error/mod.rs +80 -66
  79. package/rust/core/lexer/handler/arrow.rs +82 -31
  80. package/rust/core/lexer/handler/at.rs +21 -21
  81. package/rust/core/lexer/handler/brace.rs +41 -41
  82. package/rust/core/lexer/handler/colon.rs +21 -21
  83. package/rust/core/lexer/handler/comment.rs +30 -30
  84. package/rust/core/lexer/handler/dot.rs +21 -21
  85. package/rust/core/lexer/handler/driver.rs +337 -263
  86. package/rust/core/lexer/handler/identifier.rs +46 -42
  87. package/rust/core/lexer/handler/indent.rs +66 -66
  88. package/rust/core/lexer/handler/mod.rs +16 -16
  89. package/rust/core/lexer/handler/newline.rs +23 -23
  90. package/rust/core/lexer/handler/number.rs +31 -31
  91. package/rust/core/lexer/handler/operator.rs +46 -44
  92. package/rust/core/lexer/handler/parenthesis.rs +41 -41
  93. package/rust/core/lexer/handler/slash.rs +21 -21
  94. package/rust/core/lexer/handler/string.rs +63 -63
  95. package/rust/core/lexer/mod.rs +54 -51
  96. package/rust/core/lexer/token.rs +97 -91
  97. package/rust/core/mod.rs +11 -11
  98. package/rust/core/parser/driver.rs +513 -408
  99. package/rust/core/parser/handler/arrow_call.rs +233 -211
  100. package/rust/core/parser/handler/at.rs +245 -162
  101. package/rust/core/parser/handler/bank.rs +94 -69
  102. package/rust/core/parser/handler/condition.rs +80 -74
  103. package/rust/core/parser/handler/dot.rs +143 -135
  104. package/rust/core/parser/handler/identifier/automate.rs +257 -0
  105. package/rust/core/parser/handler/identifier/call.rs +91 -88
  106. package/rust/core/parser/handler/identifier/emit.rs +66 -0
  107. package/rust/core/parser/handler/identifier/function.rs +100 -92
  108. package/rust/core/parser/handler/identifier/group.rs +85 -75
  109. package/rust/core/parser/handler/identifier/let_.rs +158 -127
  110. package/rust/core/parser/handler/identifier/mod.rs +54 -52
  111. package/rust/core/parser/handler/identifier/on.rs +98 -0
  112. package/rust/core/parser/handler/identifier/print.rs +52 -0
  113. package/rust/core/parser/handler/identifier/sleep.rs +36 -33
  114. package/rust/core/parser/handler/identifier/spawn.rs +91 -88
  115. package/rust/core/parser/handler/identifier/synth.rs +65 -65
  116. package/rust/core/parser/handler/loop_.rs +170 -72
  117. package/rust/core/parser/handler/mod.rs +8 -8
  118. package/rust/core/parser/handler/tempo.rs +53 -47
  119. package/rust/core/parser/mod.rs +4 -4
  120. package/rust/core/parser/statement.rs +142 -108
  121. package/rust/core/plugin/loader.rs +123 -48
  122. package/rust/core/plugin/mod.rs +2 -1
  123. package/rust/core/plugin/runner.rs +296 -0
  124. package/rust/core/preprocessor/loader.rs +515 -326
  125. package/rust/core/preprocessor/mod.rs +4 -4
  126. package/rust/core/preprocessor/module.rs +60 -58
  127. package/rust/core/preprocessor/processor.rs +99 -101
  128. package/rust/core/preprocessor/resolver/bank.rs +51 -49
  129. package/rust/core/preprocessor/resolver/call.rs +100 -100
  130. package/rust/core/preprocessor/resolver/condition.rs +97 -97
  131. package/rust/core/preprocessor/resolver/driver.rs +310 -278
  132. package/rust/core/preprocessor/resolver/function.rs +69 -78
  133. package/rust/core/preprocessor/resolver/group.rs +96 -91
  134. package/rust/core/preprocessor/resolver/let_.rs +32 -28
  135. package/rust/core/preprocessor/resolver/loop_.rs +320 -91
  136. package/rust/core/preprocessor/resolver/mod.rs +15 -15
  137. package/rust/core/preprocessor/resolver/spawn.rs +76 -92
  138. package/rust/core/preprocessor/resolver/synth.rs +56 -50
  139. package/rust/core/preprocessor/resolver/tempo.rs +50 -49
  140. package/rust/core/preprocessor/resolver/trigger.rs +113 -116
  141. package/rust/core/preprocessor/resolver/value.rs +81 -87
  142. package/rust/core/shared/bank.rs +1 -1
  143. package/rust/core/shared/duration.rs +9 -9
  144. package/rust/core/shared/mod.rs +3 -3
  145. package/rust/core/shared/value.rs +35 -32
  146. package/rust/core/store/function.rs +34 -34
  147. package/rust/core/store/global.rs +55 -38
  148. package/rust/core/store/mod.rs +5 -5
  149. package/rust/core/store/variable.rs +37 -34
  150. package/rust/core/utils/mod.rs +2 -2
  151. package/rust/core/utils/path.rs +37 -31
  152. package/rust/core/utils/validation.rs +35 -37
  153. package/rust/installer/addon.rs +84 -80
  154. package/rust/installer/bank.rs +62 -65
  155. package/rust/installer/mod.rs +5 -5
  156. package/rust/installer/plugin.rs +54 -55
  157. package/rust/installer/utils.rs +56 -56
  158. package/rust/lib.rs +156 -164
  159. package/rust/main.rs +250 -145
  160. package/rust/utils/error.rs +200 -0
  161. package/rust/utils/file.rs +38 -35
  162. package/rust/utils/first_usage.rs +76 -0
  163. package/rust/utils/logger.rs +195 -139
  164. package/rust/utils/mod.rs +9 -50
  165. package/rust/utils/signature.rs +19 -17
  166. package/rust/utils/spinner.rs +22 -19
  167. package/rust/utils/telemetry.rs +292 -0
  168. package/rust/utils/watcher.rs +34 -33
  169. package/templates/minimal/README.md +97 -121
  170. package/templates/welcome/README.md +97 -121
  171. package/typescript/bin/index.ts +19 -5
  172. package/typescript/index.ts +3 -1
  173. package/typescript/scripts/postbuild.ts +10 -6
  174. package/typescript/scripts/postinstall.ts +56 -0
  175. package/typescript/scripts/version/bump.ts +0 -1
  176. package/typescript/scripts/version/index.ts +0 -1
  177. 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::{ driver::Parser, statement::StatementKind },
5
- preprocessor::{ loader::ModuleLoader, resolver::group },
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,49 +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
-
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!("Bank identifier '{ident}' not found in variable table");
26
- logger.log_error_with_stacktrace(&message, &module.path);
27
- new_stmt.kind = StatementKind::Error {
28
- message: message.clone(),
29
- };
30
- new_stmt.value = Value::Null;
31
- }
32
- }
33
-
34
- Value::String(_) => {}
35
-
36
- Value::Number(_) => {}
37
-
38
- other => {
39
- let message = format!("Expected a string or identifier for bank, found {:?}", other);
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::{
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,100 +1,100 @@
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
- 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
- _ => error_stmt(&logger, module, stmt, "Expected StatementKind::Call in resolve_call()"),
82
- }
83
- }
84
-
85
- fn get_group_body(stmt_box: &Statement) -> Vec<Statement> {
86
- if let Value::Block(body) = &stmt_box.value { body.clone() } else { vec![] }
87
- }
88
-
89
- fn error_stmt(logger: &Logger, module: &Module, stmt: &Statement, message: &str) -> Statement {
90
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
91
- logger.log_message(LogLevel::Error, &format!("{message}\n → at {stacktrace}"));
92
-
93
- Statement {
94
- kind: StatementKind::Error {
95
- message: message.to_string(),
96
- },
97
- value: Value::Null,
98
- ..stmt.clone()
99
- }
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::{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)