@devaloop/devalang 0.0.1-beta.1 → 0.0.1-beta.3

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 (207) hide show
  1. package/.devalang +9 -10
  2. package/Cargo.toml +84 -80
  3. package/README.md +10 -7
  4. package/docs/CHANGELOG.md +83 -0
  5. package/docs/ROADMAP.md +6 -2
  6. package/docs/TODO.md +3 -14
  7. package/examples/bus.deva +10 -0
  8. package/examples/chain.deva +19 -0
  9. package/examples/effect.deva +2 -0
  10. package/examples/filter.deva +11 -0
  11. package/examples/lfo.deva +9 -0
  12. package/examples/plugin.deva +10 -10
  13. package/examples/routing.deva +23 -0
  14. package/examples/synth.deva +11 -1
  15. package/examples/synth_types.deva +17 -0
  16. package/out-tsc/bin/project-version.json +6 -0
  17. package/out-tsc/core/functions/index.d.ts +5 -0
  18. package/out-tsc/core/functions/index.js +11 -0
  19. package/out-tsc/pkg/devalang_core.d.ts +2 -0
  20. package/out-tsc/pkg/devalang_core.js +17 -2
  21. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +1 -0
  22. package/out-tsc/scripts/version/copy-to-binary.d.ts +1 -0
  23. package/out-tsc/scripts/version/copy-to-binary.js +79 -0
  24. package/package.json +23 -10
  25. package/project-version.json +3 -3
  26. package/rust/bindings/Cargo.toml +9 -0
  27. package/rust/bindings/src/lib.rs +86 -0
  28. package/rust/cli/addon/commands.rs +35 -0
  29. package/rust/cli/addon/download.rs +234 -0
  30. package/rust/cli/addon/install.rs +33 -0
  31. package/rust/cli/addon/list.rs +224 -0
  32. package/rust/cli/addon/metadata.rs +124 -0
  33. package/rust/cli/addon/mod.rs +8 -0
  34. package/rust/cli/addon/remove.rs +271 -0
  35. package/rust/cli/addon/update.rs +305 -0
  36. package/rust/cli/{install/addon.rs → addon/utils.rs} +34 -43
  37. package/rust/cli/build/commands.rs +153 -103
  38. package/rust/cli/build/mod.rs +2 -2
  39. package/rust/cli/build/process.rs +165 -146
  40. package/rust/cli/check/mod.rs +208 -208
  41. package/rust/cli/discover/commands.rs +53 -31
  42. package/rust/cli/discover/config.rs +2 -4
  43. package/rust/cli/discover/install.rs +139 -28
  44. package/rust/cli/discover/metadata.rs +3 -3
  45. package/rust/cli/login/commands.rs +124 -124
  46. package/rust/cli/me/commands.rs +52 -0
  47. package/rust/cli/me/mod.rs +1 -0
  48. package/rust/cli/mod.rs +2 -2
  49. package/rust/cli/parser.rs +76 -70
  50. package/rust/cli/play/commands.rs +375 -324
  51. package/rust/cli/play/mod.rs +5 -5
  52. package/rust/cli/play/process.rs +159 -150
  53. package/rust/cli/play/realtime.rs +91 -91
  54. package/rust/cli/telemetry/commands.rs +22 -22
  55. package/rust/cli/telemetry/event_creator.rs +80 -80
  56. package/rust/cli/telemetry/mod.rs +3 -3
  57. package/rust/cli/telemetry/send.rs +51 -51
  58. package/rust/cli/template/commands.rs +69 -69
  59. package/rust/config/driver.rs +112 -103
  60. package/rust/config/mod.rs +3 -3
  61. package/rust/config/ops.rs +26 -26
  62. package/rust/config/settings.rs +101 -101
  63. package/rust/core/audio/engine/driver.rs +237 -0
  64. package/rust/core/audio/engine/export.rs +169 -0
  65. package/rust/core/audio/engine/helpers.rs +178 -170
  66. package/rust/core/audio/engine/mod.rs +56 -7
  67. package/rust/core/audio/engine/notes/dsp.rs +88 -0
  68. package/rust/core/audio/engine/notes/mod.rs +53 -0
  69. package/rust/core/audio/engine/notes/params.rs +294 -0
  70. package/rust/core/audio/engine/sample/insert.rs +300 -0
  71. package/rust/core/audio/engine/sample/mod.rs +40 -0
  72. package/rust/core/audio/engine/sample/padding.rs +170 -0
  73. package/rust/core/audio/evaluator/condition.rs +61 -0
  74. package/rust/core/audio/evaluator/mod.rs +9 -0
  75. package/rust/core/audio/{evaluator.rs → evaluator/numeric.rs} +152 -310
  76. package/rust/core/audio/evaluator/rhs.rs +16 -0
  77. package/rust/core/audio/evaluator/string_expr.rs +94 -0
  78. package/rust/core/audio/interpreter/driver.rs +574 -542
  79. package/rust/core/audio/interpreter/mod.rs +2 -14
  80. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +179 -0
  81. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +398 -0
  82. package/rust/core/audio/interpreter/statements/arrow_call/methods/effects.rs +323 -0
  83. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +3 -0
  84. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +371 -0
  85. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +3 -0
  86. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +192 -0
  87. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +24 -0
  88. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +116 -0
  89. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +97 -0
  90. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +100 -0
  91. package/rust/core/audio/interpreter/{automate.rs → statements/automate.rs} +2 -4
  92. package/rust/core/audio/interpreter/{call.rs → statements/call.rs} +36 -5
  93. package/rust/core/audio/interpreter/{condition.rs → statements/condition.rs} +72 -71
  94. package/rust/core/audio/interpreter/{function.rs → statements/function.rs} +24 -26
  95. package/rust/core/audio/interpreter/{let_.rs → statements/let_.rs} +36 -38
  96. package/rust/core/audio/interpreter/{load.rs → statements/load.rs} +17 -19
  97. package/rust/core/audio/interpreter/{loop_.rs → statements/loop_.rs} +115 -114
  98. package/rust/core/audio/interpreter/statements/mod.rs +12 -0
  99. package/rust/core/audio/interpreter/{sleep.rs → statements/sleep.rs} +28 -28
  100. package/rust/core/audio/interpreter/{spawn.rs → statements/spawn.rs} +54 -4
  101. package/rust/core/audio/interpreter/{tempo.rs → statements/tempo.rs} +40 -40
  102. package/rust/core/audio/interpreter/{trigger.rs → statements/trigger.rs} +242 -239
  103. package/rust/core/audio/loader/trigger.rs +98 -97
  104. package/rust/core/audio/mod.rs +6 -7
  105. package/rust/core/audio/special/easing.rs +189 -189
  106. package/rust/core/audio/special/env.rs +45 -45
  107. package/rust/core/audio/special/math.rs +134 -134
  108. package/rust/core/audio/special/modulator.rs +143 -143
  109. package/rust/core/builder/mod.rs +129 -86
  110. package/rust/core/debugger/{module.rs → logs.rs} +52 -55
  111. package/rust/core/debugger/mod.rs +30 -30
  112. package/rust/core/debugger/store.rs +38 -40
  113. package/rust/core/error/mod.rs +269 -269
  114. package/rust/core/lexer/driver.rs +2 -4
  115. package/rust/core/mod.rs +9 -10
  116. package/rust/core/parser/driver/block.rs +111 -0
  117. package/rust/core/parser/driver/cursor.rs +82 -0
  118. package/rust/core/parser/driver/driver_impl.rs +159 -0
  119. package/rust/core/parser/driver/mod.rs +6 -0
  120. package/rust/core/parser/driver/parse_array.rs +120 -0
  121. package/rust/core/parser/driver/parse_map.rs +247 -0
  122. package/rust/core/parser/driver/parser.rs +160 -0
  123. package/rust/core/parser/handler/arrow_call.rs +90 -15
  124. package/rust/core/parser/handler/at.rs +279 -279
  125. package/rust/core/parser/handler/bank.rs +104 -104
  126. package/rust/core/parser/handler/condition.rs +83 -83
  127. package/rust/core/parser/handler/dot.rs +148 -148
  128. package/rust/core/parser/handler/identifier/automate.rs +254 -254
  129. package/rust/core/parser/handler/identifier/call.rs +91 -91
  130. package/rust/core/parser/handler/identifier/emit.rs +70 -70
  131. package/rust/core/parser/handler/identifier/function.rs +113 -113
  132. package/rust/core/parser/handler/identifier/group.rs +89 -89
  133. package/rust/core/parser/handler/identifier/let_.rs +173 -173
  134. package/rust/core/parser/handler/identifier/mod.rs +55 -55
  135. package/rust/core/parser/handler/identifier/on.rs +107 -107
  136. package/rust/core/parser/handler/identifier/print.rs +49 -49
  137. package/rust/core/parser/handler/identifier/sleep.rs +96 -43
  138. package/rust/core/parser/handler/identifier/spawn.rs +91 -91
  139. package/rust/core/parser/handler/identifier/synth.rs +39 -3
  140. package/rust/core/parser/handler/loop_.rs +194 -194
  141. package/rust/core/parser/handler/pattern.rs +25 -2
  142. package/rust/core/parser/handler/tempo.rs +105 -57
  143. package/rust/core/parser/statement.rs +10 -11
  144. package/rust/core/plugin/loader.rs +137 -137
  145. package/rust/core/plugin/runner/mod.rs +11 -0
  146. package/rust/core/plugin/{runner.rs → runner/non_wasm.rs} +206 -72
  147. package/rust/core/plugin/runner/wasm32.rs +44 -0
  148. package/rust/core/preprocessor/loader/inject.rs +313 -0
  149. package/rust/core/preprocessor/loader/loader_helpers.rs +110 -0
  150. package/rust/core/preprocessor/loader/mod.rs +235 -0
  151. package/rust/core/preprocessor/module.rs +55 -60
  152. package/rust/core/preprocessor/{processor.rs → processor/handlers.rs} +107 -114
  153. package/rust/core/preprocessor/processor/mod.rs +1 -0
  154. package/rust/core/preprocessor/resolver/function.rs +69 -69
  155. package/rust/core/preprocessor/resolver/group.rs +122 -94
  156. package/rust/core/preprocessor/resolver/pattern.rs +14 -2
  157. package/rust/core/store/global.rs +57 -61
  158. package/rust/core/store/mod.rs +1 -5
  159. package/rust/lib.rs +323 -308
  160. package/rust/macros/Cargo.toml +14 -0
  161. package/rust/macros/src/lib.rs +52 -0
  162. package/rust/main.rs +336 -143
  163. package/rust/types/Cargo.toml +1 -1
  164. package/rust/types/src/addons.rs +57 -55
  165. package/rust/types/src/config.rs +82 -74
  166. package/rust/types/src/lib.rs +15 -12
  167. package/rust/types/src/plugin.rs +20 -0
  168. package/rust/types/src/store.rs +139 -0
  169. package/rust/types/src/telemetry.rs +85 -85
  170. package/rust/utils/Cargo.toml +5 -2
  171. package/rust/utils/src/file.rs +477 -94
  172. package/rust/utils/src/first_usage.rs +97 -97
  173. package/rust/utils/src/lib.rs +9 -9
  174. package/rust/utils/src/logger.rs +200 -200
  175. package/rust/utils/src/path.rs +158 -88
  176. package/rust/utils/src/signature.rs +41 -41
  177. package/rust/utils/src/spinner.rs +20 -20
  178. package/rust/utils/src/version.rs +58 -27
  179. package/rust/utils/src/watcher.rs +46 -46
  180. package/rust/web/api.rs +5 -5
  181. package/rust/web/auth.rs +5 -0
  182. package/rust/web/cdn.rs +34 -34
  183. package/rust/web/forge.rs +5 -0
  184. package/rust/web/mod.rs +2 -0
  185. package/tests/integration.rs +21 -21
  186. package/typescript/core/functions/index.ts +11 -0
  187. package/typescript/pkg/devalang_core.ts +20 -4
  188. package/typescript/scripts/version/copy-to-binary.ts +82 -0
  189. package/rust/cli/bank/api.rs +0 -122
  190. package/rust/cli/bank/commands.rs +0 -275
  191. package/rust/cli/bank/mod.rs +0 -29
  192. package/rust/cli/install/bank.rs +0 -53
  193. package/rust/cli/install/commands.rs +0 -35
  194. package/rust/cli/install/mod.rs +0 -4
  195. package/rust/cli/install/plugin.rs +0 -61
  196. package/rust/core/audio/engine/sample.rs +0 -366
  197. package/rust/core/audio/engine/synth.rs +0 -325
  198. package/rust/core/audio/interpreter/arrow_call.rs +0 -311
  199. package/rust/core/audio/renderer.rs +0 -54
  200. package/rust/core/parser/driver.rs +0 -584
  201. package/rust/core/preprocessor/loader.rs +0 -637
  202. package/rust/core/store/export.rs +0 -28
  203. package/rust/core/store/function.rs +0 -40
  204. package/rust/core/store/import.rs +0 -28
  205. package/rust/core/store/variable.rs +0 -51
  206. package/rust/core/utils/mod.rs +0 -1
  207. package/rust/core/utils/path.rs +0 -37
@@ -1,69 +1,69 @@
1
- use crate::core::{
2
- parser::statement::{Statement, StatementKind},
3
- preprocessor::{module::Module, resolver::driver::resolve_statement},
4
- store::{function::FunctionDef, global::GlobalStore},
5
- };
6
- use devalang_types::Value;
7
-
8
- pub fn resolve_function(
9
- stmt: &Statement,
10
- module: &Module,
11
- path: &str,
12
- global_store: &mut GlobalStore,
13
- ) -> Statement {
14
- if let StatementKind::Function {
15
- name,
16
- parameters,
17
- body,
18
- } = &stmt.kind
19
- {
20
- let resolved_body = resolve_block_statements(body, module, path, global_store);
21
-
22
- global_store.functions.add_function(FunctionDef {
23
- name: name.clone(),
24
- parameters: parameters.clone(),
25
- body: resolved_body.clone(),
26
- });
27
-
28
- if let Some(current_mod) = global_store.modules.get_mut(path) {
29
- current_mod.function_table.add_function(FunctionDef {
30
- name: name.clone(),
31
- parameters: parameters.clone(),
32
- body: resolved_body.clone(),
33
- });
34
- } else {
35
- eprintln!("[resolve_statement] ❌ Module path not found: {path}");
36
- }
37
-
38
- Statement {
39
- kind: StatementKind::Function {
40
- name: name.clone(),
41
- parameters: parameters.clone(),
42
- body: resolved_body,
43
- },
44
- value: Value::Null,
45
- ..stmt.clone()
46
- }
47
- } else {
48
- Statement {
49
- kind: StatementKind::Error {
50
- message: "Expected a function statement".to_string(),
51
- },
52
- value: Value::Null,
53
- ..stmt.clone()
54
- }
55
- }
56
- }
57
-
58
- fn resolve_block_statements(
59
- body: &[Statement],
60
- module: &Module,
61
- path: &str,
62
- global_store: &mut GlobalStore,
63
- ) -> Vec<Statement> {
64
- body.iter()
65
- .map(|stmt| resolve_statement(stmt, module, path, global_store))
66
- .collect()
67
- }
68
-
69
- // (removed unused helper type_error)
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::{FunctionDef, Value};
7
+
8
+ pub fn resolve_function(
9
+ stmt: &Statement,
10
+ module: &Module,
11
+ path: &str,
12
+ global_store: &mut GlobalStore,
13
+ ) -> Statement {
14
+ if let StatementKind::Function {
15
+ name,
16
+ parameters,
17
+ body,
18
+ } = &stmt.kind
19
+ {
20
+ let resolved_body = resolve_block_statements(body, module, path, global_store);
21
+
22
+ global_store.functions.add_function(FunctionDef {
23
+ name: name.clone(),
24
+ parameters: parameters.clone(),
25
+ body: resolved_body.clone(),
26
+ });
27
+
28
+ if let Some(current_mod) = global_store.modules.get_mut(path) {
29
+ current_mod.function_table.add_function(FunctionDef {
30
+ name: name.clone(),
31
+ parameters: parameters.clone(),
32
+ body: resolved_body.clone(),
33
+ });
34
+ } else {
35
+ eprintln!("[resolve_statement] ❌ Module path not found: {path}");
36
+ }
37
+
38
+ Statement {
39
+ kind: StatementKind::Function {
40
+ name: name.clone(),
41
+ parameters: parameters.clone(),
42
+ body: resolved_body,
43
+ },
44
+ value: Value::Null,
45
+ ..stmt.clone()
46
+ }
47
+ } else {
48
+ Statement {
49
+ kind: StatementKind::Error {
50
+ message: "Expected a function statement".to_string(),
51
+ },
52
+ value: Value::Null,
53
+ ..stmt.clone()
54
+ }
55
+ }
56
+ }
57
+
58
+ fn resolve_block_statements(
59
+ body: &[Statement],
60
+ module: &Module,
61
+ path: &str,
62
+ global_store: &mut GlobalStore,
63
+ ) -> Vec<Statement> {
64
+ body.iter()
65
+ .map(|stmt| resolve_statement(stmt, module, path, global_store))
66
+ .collect()
67
+ }
68
+
69
+ // (removed unused helper type_error)
@@ -1,94 +1,122 @@
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_group(
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(group_map) = &stmt.value else {
18
- return type_error(
19
- &logger,
20
- module,
21
- stmt,
22
- "Expected a map in group statement".to_string(),
23
- );
24
- };
25
-
26
- // Check for the presence of the identifier field
27
- let identifier = match group_map.get("identifier") {
28
- Some(Value::String(id)) => id.clone(),
29
- _ => {
30
- return type_error(
31
- &logger,
32
- module,
33
- stmt,
34
- "Group statement must have an 'identifier' field".to_string(),
35
- );
36
- }
37
- };
38
-
39
- // Ensure the identifier does not already exist
40
- if global_store.variables.variables.contains_key(&identifier) {
41
- return type_error(
42
- &logger,
43
- module,
44
- stmt,
45
- format!("Group identifier '{}' already exists", identifier),
46
- );
47
- }
48
-
49
- // Resolve statements in the body
50
- let mut resolved_map = group_map.clone();
51
- if let Some(Value::Block(body)) = group_map.get("body") {
52
- let resolved_body = resolve_block_statements(body, module, path, global_store);
53
- resolved_map.insert("body".to_string(), Value::Block(resolved_body));
54
- } else {
55
- logger.log_message(LogLevel::Warning, "Group without a body");
56
- }
57
-
58
- // Build a complete Statement for the group
59
- let resolved_group_stmt = Statement {
60
- kind: StatementKind::Group,
61
- value: Value::Map(resolved_map.clone()),
62
- ..stmt.clone()
63
- };
64
-
65
- // Store the Statement directly in the global variable_table
66
- global_store.variables.variables.insert(
67
- identifier.clone(),
68
- Value::Statement(Box::new(resolved_group_stmt.clone())),
69
- );
70
-
71
- resolved_group_stmt
72
- }
73
-
74
- fn resolve_block_statements(
75
- body: &[Statement],
76
- module: &Module,
77
- path: &str,
78
- global_store: &mut GlobalStore,
79
- ) -> Vec<Statement> {
80
- body.iter()
81
- .map(|stmt| resolve_statement(stmt, module, path, global_store))
82
- .collect()
83
- }
84
-
85
- fn type_error(logger: &Logger, module: &Module, stmt: &Statement, message: String) -> Statement {
86
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
87
- logger.log_error_with_stacktrace(&message, &stacktrace);
88
-
89
- Statement {
90
- kind: StatementKind::Error { message },
91
- value: Value::Null,
92
- ..stmt.clone()
93
- }
94
- }
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_group(
10
+ stmt: &Statement,
11
+ module: &Module,
12
+ path: &str,
13
+ global_store: &mut GlobalStore,
14
+ ) -> Statement {
15
+ let logger = Logger::new();
16
+
17
+ // Extract identifier from several allowed shapes (map.identifier, bare string, number -> to_string)
18
+ let identifier = match extract_group_identifier(stmt, &logger, module) {
19
+ Ok(id) => id,
20
+ Err(err_stmt) => return err_stmt,
21
+ };
22
+
23
+ // group_map: if the value is a map we clone it, otherwise create an empty map to hold body
24
+ let group_map = match &stmt.value {
25
+ Value::Map(m) => m.clone(),
26
+ _ => std::collections::HashMap::new(),
27
+ };
28
+
29
+ // Ensure the identifier does not already exist
30
+ if global_store.variables.variables.contains_key(&identifier) {
31
+ return type_error(
32
+ &logger,
33
+ module,
34
+ stmt,
35
+ format!("Group identifier '{}' already exists", identifier),
36
+ );
37
+ }
38
+
39
+ // Resolve statements in the body
40
+ let mut resolved_map = group_map.clone();
41
+ if let Some(Value::Block(body)) = group_map.get("body") {
42
+ let resolved_body = resolve_block_statements(body, module, path, global_store);
43
+ resolved_map.insert("body".to_string(), Value::Block(resolved_body));
44
+ } else {
45
+ logger.log_message(LogLevel::Warning, "Group without a body");
46
+ }
47
+
48
+ // Build a complete Statement for the group
49
+ let resolved_group_stmt = Statement {
50
+ kind: StatementKind::Group,
51
+ value: Value::Map(resolved_map.clone()),
52
+ ..stmt.clone()
53
+ };
54
+
55
+ // Store the Statement directly in the global variable_table
56
+ global_store.variables.variables.insert(
57
+ identifier.clone(),
58
+ Value::Statement(Box::new(resolved_group_stmt.clone())),
59
+ );
60
+
61
+ resolved_group_stmt
62
+ }
63
+
64
+ fn resolve_block_statements(
65
+ body: &[Statement],
66
+ module: &Module,
67
+ path: &str,
68
+ global_store: &mut GlobalStore,
69
+ ) -> Vec<Statement> {
70
+ body.iter()
71
+ .map(|stmt| resolve_statement(stmt, module, path, global_store))
72
+ .collect()
73
+ }
74
+
75
+ fn type_error(logger: &Logger, module: &Module, stmt: &Statement, message: String) -> Statement {
76
+ let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
77
+ logger.log_error_with_stacktrace(&message, &stacktrace);
78
+
79
+ Statement {
80
+ kind: StatementKind::Error { message },
81
+ value: Value::Null,
82
+ ..stmt.clone()
83
+ }
84
+ }
85
+
86
+ // Helper to extract a group identifier from multiple Value forms
87
+ fn extract_group_identifier(
88
+ stmt: &Statement,
89
+ logger: &Logger,
90
+ module: &Module,
91
+ ) -> Result<String, Statement> {
92
+ match &stmt.value {
93
+ Value::Map(map) => match map.get("identifier") {
94
+ Some(Value::String(s)) => Ok(s.clone()),
95
+ Some(Value::Identifier(s)) => Ok(s.clone()),
96
+ Some(Value::Number(n)) => Ok(n.to_string()),
97
+ Some(other) => Err(type_error(
98
+ logger,
99
+ module,
100
+ stmt,
101
+ format!("Unsupported type for 'identifier': {:?}", other),
102
+ )),
103
+ None => Err(type_error(
104
+ logger,
105
+ module,
106
+ stmt,
107
+ "Group statement must have an 'identifier' field".to_string(),
108
+ )),
109
+ },
110
+ Value::String(s) => Ok(s.clone()),
111
+ Value::Identifier(s) => Ok(s.clone()),
112
+ other => Err(type_error(
113
+ logger,
114
+ module,
115
+ stmt,
116
+ format!(
117
+ "Expected a map or string for group statement, found {:?}",
118
+ other
119
+ ),
120
+ )),
121
+ }
122
+ }
@@ -39,8 +39,20 @@ pub fn resolve_pattern(
39
39
  if let Some(t) = target {
40
40
  map.insert("target".to_string(), Value::String(t.clone()));
41
41
  }
42
- // Keep raw pattern in 'pattern' key
43
- map.insert("pattern".to_string(), resolved_value.clone());
42
+ // Keep raw pattern in 'pattern' key if it's a string, or merge options map
43
+ match resolved_value.clone() {
44
+ Value::String(s) => {
45
+ map.insert("pattern".to_string(), Value::String(s));
46
+ }
47
+ Value::Map(m) => {
48
+ for (k, v) in m {
49
+ map.insert(k, v);
50
+ }
51
+ }
52
+ _ => {
53
+ map.insert("pattern".to_string(), resolved_value.clone());
54
+ }
55
+ }
44
56
 
45
57
  let resolved_stmt = Statement {
46
58
  kind: StatementKind::Pattern {
@@ -1,61 +1,57 @@
1
- use crate::core::{
2
- parser::statement::Statement,
3
- preprocessor::module::Module,
4
- store::{function::FunctionTable, variable::VariableTable},
5
- };
6
- use devalang_types::PluginInfo;
7
- use std::collections::HashMap;
8
-
9
- #[derive(Debug, Clone)]
10
- pub struct GlobalStore {
11
- pub modules: HashMap<String, Module>,
12
- pub variables: VariableTable,
13
- pub functions: FunctionTable,
14
- pub events: HashMap<String, Vec<Statement>>,
15
- pub plugins: HashMap<String, (PluginInfo, Vec<u8>)>,
16
- }
17
-
18
- impl Default for GlobalStore {
19
- fn default() -> Self {
20
- Self::new()
21
- }
22
- }
23
-
24
- impl GlobalStore {
25
- pub fn new() -> Self {
26
- GlobalStore {
27
- modules: HashMap::new(),
28
- functions: FunctionTable::new(),
29
- variables: VariableTable::new(),
30
- events: HashMap::new(),
31
- plugins: HashMap::new(),
32
- }
33
- }
34
-
35
- pub fn insert_module(&mut self, path: String, module: Module) {
36
- self.modules.insert(path, module);
37
- }
38
-
39
- pub fn modules_mut(&mut self) -> &mut HashMap<String, Module> {
40
- &mut self.modules
41
- }
42
-
43
- pub fn get_module(&self, path: &str) -> Option<&Module> {
44
- self.modules.get(path)
45
- }
46
-
47
- pub fn remove_module(&mut self, path: &str) -> Option<Module> {
48
- self.modules.remove(path)
49
- }
50
-
51
- pub fn register_event_handler(&mut self, event: &str, handler: Statement) {
52
- self.events
53
- .entry(event.to_string())
54
- .or_default()
55
- .push(handler);
56
- }
57
-
58
- pub fn get_event_handlers(&self, event: &str) -> Option<&Vec<Statement>> {
59
- self.events.get(event)
60
- }
61
- }
1
+ use crate::core::{parser::statement::Statement, preprocessor::module::Module};
2
+ use devalang_types::{FunctionTable, VariableTable, plugin::PluginInfo};
3
+ use std::collections::HashMap;
4
+
5
+ #[derive(Debug, Clone)]
6
+ pub struct GlobalStore {
7
+ pub modules: HashMap<String, Module>,
8
+ pub variables: VariableTable,
9
+ pub functions: FunctionTable,
10
+ pub events: HashMap<String, Vec<Statement>>,
11
+ pub plugins: HashMap<String, (PluginInfo, Vec<u8>)>,
12
+ }
13
+
14
+ impl Default for GlobalStore {
15
+ fn default() -> Self {
16
+ Self::new()
17
+ }
18
+ }
19
+
20
+ impl GlobalStore {
21
+ pub fn new() -> Self {
22
+ GlobalStore {
23
+ modules: HashMap::new(),
24
+ functions: FunctionTable::new(),
25
+ variables: VariableTable::new(),
26
+ events: HashMap::new(),
27
+ plugins: HashMap::new(),
28
+ }
29
+ }
30
+
31
+ pub fn insert_module(&mut self, path: String, module: Module) {
32
+ self.modules.insert(path, module);
33
+ }
34
+
35
+ pub fn modules_mut(&mut self) -> &mut HashMap<String, Module> {
36
+ &mut self.modules
37
+ }
38
+
39
+ pub fn get_module(&self, path: &str) -> Option<&Module> {
40
+ self.modules.get(path)
41
+ }
42
+
43
+ pub fn remove_module(&mut self, path: &str) -> Option<Module> {
44
+ self.modules.remove(path)
45
+ }
46
+
47
+ pub fn register_event_handler(&mut self, event: &str, handler: Statement) {
48
+ self.events
49
+ .entry(event.to_string())
50
+ .or_default()
51
+ .push(handler);
52
+ }
53
+
54
+ pub fn get_event_handlers(&self, event: &str) -> Option<&Vec<Statement>> {
55
+ self.events.get(event)
56
+ }
57
+ }
@@ -1,5 +1 @@
1
- pub mod export;
2
- pub mod function;
3
- pub mod global;
4
- pub mod import;
5
- pub mod variable;
1
+ pub mod global;