@devaloop/devalang 0.0.1-alpha.16-hotfix.3 → 0.0.1-alpha.18

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 (239) hide show
  1. package/.cargo/config.toml +2 -0
  2. package/.devalang +10 -10
  3. package/.github/workflows/ci.yml +0 -1
  4. package/Cargo.toml +18 -2
  5. package/README.md +82 -34
  6. package/docs/CHANGELOG.md +91 -0
  7. package/docs/ROADMAP.md +7 -4
  8. package/docs/TODO.md +1 -1
  9. package/examples/index.deva +55 -35
  10. package/examples/pattern.deva +5 -5
  11. package/out-tsc/bin/index.d.ts +2 -0
  12. package/out-tsc/core/functions/index.d.ts +37 -0
  13. package/out-tsc/core/functions/index.js +76 -0
  14. package/out-tsc/core/index.d.ts +6 -0
  15. package/out-tsc/core/index.js +22 -0
  16. package/out-tsc/core/types/index.d.ts +4 -0
  17. package/out-tsc/core/types/index.js +20 -0
  18. package/out-tsc/core/types/plugin.d.ts +18 -0
  19. package/out-tsc/core/types/plugin.js +2 -0
  20. package/out-tsc/core/types/result.d.ts +27 -0
  21. package/out-tsc/core/types/result.js +2 -0
  22. package/out-tsc/core/types/statement.d.ts +106 -0
  23. package/out-tsc/core/types/statement.js +2 -0
  24. package/out-tsc/core/types/value.d.ts +43 -0
  25. package/out-tsc/core/types/value.js +2 -0
  26. package/out-tsc/index.d.ts +7 -0
  27. package/out-tsc/index.js +41 -2
  28. package/out-tsc/pkg/devalang_core.d.ts +7 -0
  29. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +33 -0
  30. package/out-tsc/scripts/copy-wasm-dts.d.ts +1 -0
  31. package/out-tsc/scripts/copy-wasm-dts.js +73 -0
  32. package/out-tsc/scripts/postinstall.d.ts +1 -0
  33. package/out-tsc/scripts/postinstall.js +33 -23
  34. package/out-tsc/scripts/version/bump.d.ts +1 -0
  35. package/out-tsc/scripts/version/fetch.d.ts +1 -0
  36. package/out-tsc/scripts/version/index.d.ts +1 -0
  37. package/out-tsc/scripts/version/sync.d.ts +1 -0
  38. package/package.json +16 -4
  39. package/project-version.json +3 -3
  40. package/rust/cli/bank/api.rs +122 -0
  41. package/rust/cli/bank/commands.rs +275 -0
  42. package/rust/cli/bank/mod.rs +29 -0
  43. package/rust/cli/build/commands.rs +107 -0
  44. package/rust/cli/build/mod.rs +2 -0
  45. package/rust/cli/build/process.rs +146 -0
  46. package/rust/cli/{check.rs → check/mod.rs} +18 -31
  47. package/rust/cli/discover/commands.rs +253 -0
  48. package/rust/cli/discover/config.rs +111 -0
  49. package/rust/cli/discover/fs.rs +19 -0
  50. package/rust/cli/discover/install.rs +103 -0
  51. package/rust/cli/discover/metadata.rs +48 -0
  52. package/rust/cli/discover/mod.rs +5 -0
  53. package/rust/cli/{init.rs → init/commands.rs} +88 -87
  54. package/rust/cli/init/mod.rs +1 -0
  55. package/rust/cli/install/addon.rs +126 -0
  56. package/rust/cli/install/bank.rs +53 -0
  57. package/rust/cli/{install.rs → install/commands.rs} +9 -9
  58. package/rust/{installer → cli/install}/mod.rs +2 -3
  59. package/rust/cli/install/plugin.rs +61 -0
  60. package/rust/cli/{login.rs → login/commands.rs} +8 -11
  61. package/rust/cli/login/mod.rs +1 -0
  62. package/rust/cli/mod.rs +2 -2
  63. package/rust/cli/{driver.rs → parser.rs} +7 -2
  64. package/rust/cli/play/commands.rs +324 -0
  65. package/rust/cli/play/io.rs +17 -0
  66. package/rust/cli/play/mod.rs +5 -0
  67. package/rust/cli/play/process.rs +150 -0
  68. package/rust/cli/play/realtime.rs +91 -0
  69. package/rust/cli/play/utils.rs +23 -0
  70. package/rust/cli/{telemetry.rs → telemetry/commands.rs} +4 -4
  71. package/rust/cli/telemetry/event_creator.rs +80 -0
  72. package/rust/cli/telemetry/mod.rs +3 -0
  73. package/rust/cli/telemetry/send.rs +51 -0
  74. package/rust/cli/{template.rs → template/commands.rs} +1 -1
  75. package/rust/cli/template/mod.rs +1 -0
  76. package/rust/cli/{update.rs → update/commands.rs} +6 -6
  77. package/rust/cli/update/mod.rs +1 -0
  78. package/rust/config/driver.rs +57 -72
  79. package/rust/config/mod.rs +1 -2
  80. package/rust/config/ops.rs +26 -0
  81. package/rust/config/settings.rs +40 -42
  82. package/rust/core/audio/engine/helpers.rs +158 -0
  83. package/rust/core/audio/engine/mod.rs +7 -0
  84. package/rust/core/audio/engine/sample.rs +359 -0
  85. package/rust/core/audio/engine/synth.rs +325 -0
  86. package/rust/core/audio/evaluator.rs +68 -27
  87. package/rust/core/audio/interpreter/arrow_call.rs +113 -33
  88. package/rust/core/audio/interpreter/call.rs +232 -56
  89. package/rust/core/audio/interpreter/condition.rs +3 -2
  90. package/rust/core/audio/interpreter/driver.rs +206 -151
  91. package/rust/core/audio/interpreter/let_.rs +1 -1
  92. package/rust/core/audio/interpreter/load.rs +2 -1
  93. package/rust/core/audio/interpreter/loop_.rs +7 -6
  94. package/rust/core/audio/interpreter/sleep.rs +2 -1
  95. package/rust/core/audio/interpreter/spawn.rs +186 -54
  96. package/rust/core/audio/interpreter/tempo.rs +31 -10
  97. package/rust/core/audio/interpreter/trigger.rs +2 -2
  98. package/rust/core/audio/loader/trigger.rs +4 -7
  99. package/rust/core/audio/player.rs +6 -0
  100. package/rust/core/audio/renderer.rs +5 -7
  101. package/rust/core/audio/special/env.rs +3 -1
  102. package/rust/core/audio/special/math.rs +26 -6
  103. package/rust/core/audio/special/modulator.rs +2 -2
  104. package/rust/core/builder/mod.rs +9 -3
  105. package/rust/core/debugger/lexer.rs +1 -1
  106. package/rust/core/debugger/mod.rs +6 -0
  107. package/rust/core/debugger/module.rs +4 -4
  108. package/rust/core/debugger/preprocessor.rs +1 -1
  109. package/rust/core/debugger/store.rs +2 -2
  110. package/rust/core/error/mod.rs +189 -0
  111. package/rust/core/lexer/driver.rs +61 -0
  112. package/rust/core/lexer/handler/arrow.rs +1 -1
  113. package/rust/core/lexer/handler/at.rs +1 -1
  114. package/rust/core/lexer/handler/brace.rs +2 -2
  115. package/rust/core/lexer/handler/colon.rs +1 -1
  116. package/rust/core/lexer/handler/comment.rs +1 -1
  117. package/rust/core/lexer/handler/dot.rs +1 -1
  118. package/rust/core/lexer/handler/driver.rs +1 -1
  119. package/rust/core/lexer/handler/identifier.rs +4 -3
  120. package/rust/core/lexer/handler/mod.rs +1 -2
  121. package/rust/core/lexer/handler/number.rs +1 -1
  122. package/rust/core/lexer/handler/operator.rs +1 -1
  123. package/rust/core/lexer/handler/parenthesis.rs +2 -2
  124. package/rust/core/lexer/handler/slash.rs +1 -1
  125. package/rust/core/lexer/handler/string.rs +1 -1
  126. package/rust/core/lexer/mod.rs +1 -52
  127. package/rust/core/lexer/token.rs +91 -97
  128. package/rust/core/mod.rs +0 -1
  129. package/rust/core/parser/driver.rs +78 -22
  130. package/rust/core/parser/handler/arrow_call.rs +28 -8
  131. package/rust/core/parser/handler/at.rs +55 -21
  132. package/rust/core/parser/handler/bank.rs +14 -4
  133. package/rust/core/parser/handler/condition.rs +6 -3
  134. package/rust/core/parser/handler/dot.rs +5 -3
  135. package/rust/core/parser/handler/identifier/automate.rs +13 -16
  136. package/rust/core/parser/handler/identifier/call.rs +4 -4
  137. package/rust/core/parser/handler/identifier/emit.rs +9 -5
  138. package/rust/core/parser/handler/identifier/function.rs +20 -7
  139. package/rust/core/parser/handler/identifier/group.rs +11 -7
  140. package/rust/core/parser/handler/identifier/let_.rs +24 -9
  141. package/rust/core/parser/handler/identifier/mod.rs +6 -5
  142. package/rust/core/parser/handler/identifier/on.rs +16 -7
  143. package/rust/core/parser/handler/identifier/print.rs +6 -9
  144. package/rust/core/parser/handler/identifier/sleep.rs +12 -5
  145. package/rust/core/parser/handler/identifier/spawn.rs +4 -4
  146. package/rust/core/parser/handler/identifier/synth.rs +79 -9
  147. package/rust/core/parser/handler/loop_.rs +38 -13
  148. package/rust/core/parser/handler/mod.rs +1 -0
  149. package/rust/core/parser/handler/pattern.rs +74 -0
  150. package/rust/core/parser/handler/tempo.rs +9 -5
  151. package/rust/core/parser/mod.rs +0 -1
  152. package/rust/core/parser/statement.rs +6 -137
  153. package/rust/core/plugin/loader.rs +41 -27
  154. package/rust/core/plugin/runner.rs +68 -17
  155. package/rust/core/preprocessor/loader.rs +181 -99
  156. package/rust/core/preprocessor/processor.rs +9 -9
  157. package/rust/core/preprocessor/resolver/bank.rs +6 -8
  158. package/rust/core/preprocessor/resolver/call.rs +47 -23
  159. package/rust/core/preprocessor/resolver/condition.rs +6 -8
  160. package/rust/core/preprocessor/resolver/driver.rs +28 -28
  161. package/rust/core/preprocessor/resolver/function.rs +6 -6
  162. package/rust/core/preprocessor/resolver/group.rs +6 -8
  163. package/rust/core/preprocessor/resolver/loop_.rs +8 -10
  164. package/rust/core/preprocessor/resolver/mod.rs +1 -0
  165. package/rust/core/preprocessor/resolver/pattern.rs +75 -0
  166. package/rust/core/preprocessor/resolver/spawn.rs +45 -22
  167. package/rust/core/preprocessor/resolver/synth.rs +6 -8
  168. package/rust/core/preprocessor/resolver/tempo.rs +6 -8
  169. package/rust/core/preprocessor/resolver/trigger.rs +22 -19
  170. package/rust/core/preprocessor/resolver/value.rs +99 -4
  171. package/rust/core/store/export.rs +28 -28
  172. package/rust/core/store/function.rs +6 -0
  173. package/rust/core/store/global.rs +7 -1
  174. package/rust/core/store/import.rs +28 -28
  175. package/rust/core/store/variable.rs +16 -2
  176. package/rust/core/utils/mod.rs +0 -1
  177. package/rust/lib.rs +102 -9
  178. package/rust/main.rs +159 -45
  179. package/rust/types/Cargo.toml +11 -0
  180. package/rust/types/src/addons.rs +55 -0
  181. package/rust/types/src/ast.rs +202 -0
  182. package/rust/types/src/config.rs +74 -0
  183. package/rust/types/src/lib.rs +12 -0
  184. package/rust/types/src/telemetry.rs +85 -0
  185. package/rust/utils/Cargo.toml +26 -0
  186. package/rust/utils/{error.rs → src/error.rs} +186 -200
  187. package/rust/utils/src/file.rs +94 -0
  188. package/rust/utils/src/first_usage.rs +97 -0
  189. package/rust/utils/{mod.rs → src/lib.rs} +1 -1
  190. package/rust/utils/{logger.rs → src/logger.rs} +17 -12
  191. package/rust/utils/src/path.rs +88 -0
  192. package/rust/utils/src/signature.rs +41 -0
  193. package/rust/utils/{spinner.rs → src/spinner.rs} +3 -5
  194. package/rust/utils/src/version.rs +27 -0
  195. package/rust/utils/{watcher.rs → src/watcher.rs} +13 -1
  196. package/rust/web/cdn.rs +34 -0
  197. package/templates/minimal/README.md +98 -54
  198. package/templates/welcome/README.md +98 -54
  199. package/templates/welcome/src/index.deva +56 -8
  200. package/templates/welcome/src/variables.deva +2 -4
  201. package/tests/rust/TODO.md +0 -0
  202. package/tests/typescript/index.spec.ts +136 -0
  203. package/tests/typescript/playhead.spec.ts +36 -0
  204. package/tests/typescript/render_e2e.spec.ts +77 -0
  205. package/tsconfig.json +1 -1
  206. package/typescript/core/functions/index.ts +83 -0
  207. package/typescript/core/index.ts +6 -0
  208. package/typescript/core/types/index.ts +4 -0
  209. package/typescript/core/types/plugin.ts +19 -0
  210. package/typescript/core/types/result.ts +29 -0
  211. package/typescript/core/types/statement.ts +47 -0
  212. package/typescript/core/types/value.ts +29 -0
  213. package/typescript/index.ts +7 -2
  214. package/typescript/pkg/devalang_core.d.ts +4 -0
  215. package/typescript/scripts/copy-wasm-dts.ts +41 -0
  216. package/rust/cli/bank.rs +0 -462
  217. package/rust/cli/build.rs +0 -252
  218. package/rust/cli/play.rs +0 -1123
  219. package/rust/common/cdn.rs +0 -5
  220. package/rust/config/loader.rs +0 -165
  221. package/rust/config/stats.rs +0 -257
  222. package/rust/core/audio/engine.rs +0 -696
  223. package/rust/core/shared/bank.rs +0 -21
  224. package/rust/core/shared/duration.rs +0 -9
  225. package/rust/core/shared/mod.rs +0 -3
  226. package/rust/core/shared/value.rs +0 -35
  227. package/rust/core/utils/validation.rs +0 -35
  228. package/rust/installer/addon.rs +0 -84
  229. package/rust/installer/bank.rs +0 -62
  230. package/rust/installer/plugin.rs +0 -54
  231. package/rust/installer/utils.rs +0 -56
  232. package/rust/utils/file.rs +0 -38
  233. package/rust/utils/first_usage.rs +0 -83
  234. package/rust/utils/signature.rs +0 -19
  235. package/rust/utils/telemetry.rs +0 -292
  236. package/rust/utils/version.rs +0 -15
  237. /package/rust/{common → web}/api.rs +0 -0
  238. /package/rust/{common → web}/mod.rs +0 -0
  239. /package/rust/{common → web}/sso.rs +0 -0
@@ -1,12 +1,10 @@
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},
1
+ use crate::core::{
2
+ parser::statement::{Statement, StatementKind},
3
+ preprocessor::module::Module,
4
+ store::global::GlobalStore,
9
5
  };
6
+ use devalang_types::Value;
7
+ use devalang_utils::logger::{LogLevel, Logger};
10
8
 
11
9
  pub fn resolve_call(
12
10
  stmt: &Statement,
@@ -44,25 +42,51 @@ pub fn resolve_call(
44
42
  }
45
43
 
46
44
  // 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()));
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()));
57
54
 
58
- return Statement {
59
- kind: StatementKind::Call { name, args },
60
- value: Value::Map(resolved_map),
61
- ..stmt.clone()
62
- };
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());
63
79
  }
64
80
  }
81
+ _ => {}
65
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
+ };
66
90
  }
67
91
  }
68
92
 
@@ -1,12 +1,10 @@
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,
1
+ use crate::core::{
2
+ parser::statement::{Statement, StatementKind},
3
+ preprocessor::{module::Module, resolver::driver::resolve_statement},
4
+ store::global::GlobalStore,
9
5
  };
6
+ use devalang_types::Value;
7
+ use devalang_utils::logger::Logger;
10
8
 
11
9
  pub fn resolve_condition(
12
10
  stmt: &Statement,
@@ -1,21 +1,20 @@
1
- use crate::{
2
- core::{
3
- parser::statement::{Statement, StatementKind},
4
- preprocessor::{
5
- loader::ModuleLoader,
6
- module::Module,
7
- resolver::{
8
- bank::resolve_bank, call::resolve_call, condition::resolve_condition,
9
- function::resolve_function, group::resolve_group, let_::resolve_let,
10
- loop_::resolve_loop, spawn::resolve_spawn, tempo::resolve_tempo,
11
- trigger::resolve_trigger,
12
- },
1
+ use crate::core::{
2
+ parser::statement::{Statement, StatementKind},
3
+ preprocessor::{
4
+ loader::ModuleLoader,
5
+ module::Module,
6
+ resolver::{
7
+ bank::resolve_bank, call::resolve_call, condition::resolve_condition,
8
+ function::resolve_function, group::resolve_group, pattern::resolve_pattern, let_::resolve_let,
9
+ loop_::resolve_loop, spawn::resolve_spawn, tempo::resolve_tempo,
10
+ trigger::resolve_trigger,
13
11
  },
14
- shared::value::Value,
15
- store::global::GlobalStore,
16
12
  },
17
- utils::logger::Logger,
13
+ store::global::GlobalStore,
18
14
  };
15
+ use devalang_types::Value;
16
+ use devalang_utils::logger::Logger;
17
+ use devalang_utils::logger::LogLevel;
19
18
  use std::collections::HashMap;
20
19
 
21
20
  pub fn resolve_all_modules(module_loader: &ModuleLoader, global_store: &mut GlobalStore) {
@@ -68,7 +67,8 @@ pub fn resolve_statement(
68
67
  global_store,
69
68
  ),
70
69
  StatementKind::If => resolve_condition(stmt, module, path, global_store),
71
- StatementKind::Group => resolve_group(stmt, module, path, global_store),
70
+ StatementKind::Group => resolve_group(stmt, module, path, global_store),
71
+ StatementKind::Pattern { .. } => resolve_pattern(stmt, module, path, global_store),
72
72
  StatementKind::Call { name, args } => {
73
73
  resolve_call(stmt, name.clone(), args.clone(), module, path, global_store)
74
74
  }
@@ -92,6 +92,7 @@ pub fn resolve_statement(
92
92
  }
93
93
 
94
94
  fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore) -> Value {
95
+ let logger = Logger::new();
95
96
  match value {
96
97
  Value::Identifier(name) => {
97
98
  if let Some(original_val) = module.variable_table.get(name) {
@@ -109,7 +110,7 @@ fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore)
109
110
  Value::String(s) => Value::String(s.clone()),
110
111
 
111
112
  Value::Beat(beat_str) => {
112
- println!("[warn] '{:?}': unresolved beat '{}'", module.path, beat_str);
113
+ logger.log_message(LogLevel::Warning, &format!("[warn] '{:?}': unresolved beat '{}'", module.path, beat_str));
113
114
  Value::Beat(beat_str.clone())
114
115
  }
115
116
 
@@ -134,7 +135,7 @@ fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore)
134
135
  }
135
136
 
136
137
  fn find_export_value(name: &str, global_store: &GlobalStore) -> Option<Value> {
137
- for (_path, module) in &global_store.modules {
138
+ for module in global_store.modules.values() {
138
139
  if let Some(val) = module.export_table.get_export(name) {
139
140
  return Some(val.clone());
140
141
  }
@@ -143,6 +144,7 @@ fn find_export_value(name: &str, global_store: &GlobalStore) -> Option<Value> {
143
144
  }
144
145
 
145
146
  pub fn resolve_imports(_module_loader: &ModuleLoader, global_store: &mut GlobalStore) {
147
+ let logger = Logger::new();
146
148
  for (module_path, module) in global_store.clone().modules.iter_mut() {
147
149
  for (name, source_path) in &module.import_table.imports {
148
150
  match source_path {
@@ -151,21 +153,14 @@ pub fn resolve_imports(_module_loader: &ModuleLoader, global_store: &mut GlobalS
151
153
  if let Some(value) = source_module.export_table.get_export(name) {
152
154
  module.variable_table.set(name.clone(), value.clone());
153
155
  } else {
154
- println!(
155
- "[warn] '{module_path}': '{name}' not found in exports of '{source_path}'"
156
- );
156
+ logger.log_message(LogLevel::Warning, &format!("[warn] '{module_path}': '{name}' not found in exports of '{source_path}'"));
157
157
  }
158
158
  } else {
159
- println!(
160
- "[warn] '{module_path}': cannot find source module '{source_path}'"
161
- );
159
+ logger.log_message(LogLevel::Warning, &format!("[warn] '{module_path}': cannot find source module '{source_path}'"));
162
160
  }
163
161
  }
164
162
  _ => {
165
- println!(
166
- "[warn] '{module_path}': expected string for import source, found {:?}",
167
- source_path
168
- );
163
+ logger.log_message(LogLevel::Warning, &format!("[warn] '{module_path}': expected string for import source, found {:?}", source_path));
169
164
  }
170
165
  }
171
166
  }
@@ -288,6 +283,11 @@ pub fn resolve_and_flatten_all_modules(
288
283
  resolved.push(resolved_stmt);
289
284
  }
290
285
 
286
+ StatementKind::Pattern { .. } => {
287
+ let resolved_stmt = resolve_pattern(&stmt, &module, &path, global_store);
288
+ resolved.push(resolved_stmt);
289
+ }
290
+
291
291
  StatementKind::Function {
292
292
  name: _,
293
293
  parameters: _,
@@ -1,9 +1,9 @@
1
1
  use crate::core::{
2
2
  parser::statement::{Statement, StatementKind},
3
3
  preprocessor::{module::Module, resolver::driver::resolve_statement},
4
- shared::value::Value,
5
4
  store::{function::FunctionDef, global::GlobalStore},
6
5
  };
6
+ use devalang_types::Value;
7
7
 
8
8
  pub fn resolve_function(
9
9
  stmt: &Statement,
@@ -17,7 +17,7 @@ pub fn resolve_function(
17
17
  body,
18
18
  } = &stmt.kind
19
19
  {
20
- let resolved_body = resolve_block_statements(body, &module, path, global_store);
20
+ let resolved_body = resolve_block_statements(body, module, path, global_store);
21
21
 
22
22
  global_store.functions.add_function(FunctionDef {
23
23
  name: name.clone(),
@@ -35,7 +35,7 @@ pub fn resolve_function(
35
35
  eprintln!("[resolve_statement] ❌ Module path not found: {path}");
36
36
  }
37
37
 
38
- return Statement {
38
+ Statement {
39
39
  kind: StatementKind::Function {
40
40
  name: name.clone(),
41
41
  parameters: parameters.clone(),
@@ -43,15 +43,15 @@ pub fn resolve_function(
43
43
  },
44
44
  value: Value::Null,
45
45
  ..stmt.clone()
46
- };
46
+ }
47
47
  } else {
48
- return Statement {
48
+ Statement {
49
49
  kind: StatementKind::Error {
50
50
  message: "Expected a function statement".to_string(),
51
51
  },
52
52
  value: Value::Null,
53
53
  ..stmt.clone()
54
- };
54
+ }
55
55
  }
56
56
  }
57
57
 
@@ -1,12 +1,10 @@
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::{LogLevel, Logger},
1
+ use crate::core::{
2
+ parser::statement::{Statement, StatementKind},
3
+ preprocessor::{module::Module, resolver::driver::resolve_statement},
4
+ store::global::GlobalStore,
9
5
  };
6
+ use devalang_types::Value;
7
+ use devalang_utils::logger::{LogLevel, Logger};
10
8
 
11
9
  pub fn resolve_group(
12
10
  stmt: &Statement,
@@ -1,17 +1,15 @@
1
1
  use std::collections::HashMap;
2
2
 
3
- use crate::{
4
- core::{
5
- parser::statement::{Statement, StatementKind},
6
- preprocessor::{
7
- module::Module,
8
- resolver::{driver::resolve_statement, value::resolve_value},
9
- },
10
- shared::value::Value,
11
- store::global::GlobalStore,
3
+ use crate::core::{
4
+ parser::statement::{Statement, StatementKind},
5
+ preprocessor::{
6
+ module::Module,
7
+ resolver::{driver::resolve_statement, value::resolve_value},
12
8
  },
13
- utils::logger::Logger,
9
+ store::global::GlobalStore,
14
10
  };
11
+ use devalang_types::Value;
12
+ use devalang_utils::logger::Logger;
15
13
 
16
14
  pub fn resolve_loop(
17
15
  stmt: &Statement,
@@ -7,6 +7,7 @@ pub mod call;
7
7
  pub mod condition;
8
8
  pub mod function;
9
9
  pub mod group;
10
+ pub mod pattern;
10
11
  pub mod let_;
11
12
  pub mod loop_;
12
13
  pub mod spawn;
@@ -0,0 +1,75 @@
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_pattern(
10
+ stmt: &Statement,
11
+ module: &Module,
12
+ path: &str,
13
+ global_store: &mut GlobalStore,
14
+ ) -> Statement {
15
+ let logger = Logger::new();
16
+
17
+ // Expecting pattern name stored on the Statement.kind; value may contain the string
18
+ if let StatementKind::Pattern { name, target } = &stmt.kind {
19
+ // Ensure name doesn't already exist
20
+ if global_store.variables.variables.contains_key(name) {
21
+ logger.log_error_with_stacktrace(&format!("Pattern identifier '{}' already exists", name), path);
22
+ return Statement {
23
+ kind: StatementKind::Error { message: format!("Pattern '{}' already exists", name) },
24
+ ..stmt.clone()
25
+ };
26
+ }
27
+
28
+ // Resolve potential target and pattern string value
29
+ let resolved_value = resolve_value(&stmt.value, module, global_store);
30
+
31
+ // Build a map to store the pattern definition
32
+ let mut map = std::collections::HashMap::new();
33
+ map.insert("identifier".to_string(), Value::String(name.clone()));
34
+ if let Some(t) = target {
35
+ map.insert("target".to_string(), Value::String(t.clone()));
36
+ }
37
+ // Keep raw pattern in 'pattern' key
38
+ map.insert("pattern".to_string(), resolved_value.clone());
39
+
40
+ let resolved_stmt = Statement {
41
+ kind: StatementKind::Pattern {
42
+ name: name.clone(),
43
+ target: target.clone(),
44
+ },
45
+ value: resolved_value,
46
+ ..stmt.clone()
47
+ };
48
+
49
+ // Store into global variables as a Statement
50
+ global_store.variables.variables.insert(
51
+ name.clone(),
52
+ Value::Statement(Box::new(resolved_stmt.clone())),
53
+ );
54
+
55
+ return resolved_stmt;
56
+ }
57
+
58
+ logger.log_message(LogLevel::Warning, "resolve_pattern called on non-pattern statement");
59
+ stmt.clone()
60
+ }
61
+
62
+ fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore) -> Value {
63
+ // reuse driver::resolve_value logic; simple local resolution for pattern value
64
+ match value {
65
+ Value::String(s) => Value::String(s.clone()),
66
+ Value::Map(m) => {
67
+ let mut resolved = std::collections::HashMap::new();
68
+ for (k, v) in m {
69
+ resolved.insert(k.clone(), resolve_value(v, module, global_store));
70
+ }
71
+ Value::Map(resolved)
72
+ }
73
+ other => other.clone(),
74
+ }
75
+ }
@@ -1,12 +1,10 @@
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},
1
+ use crate::core::{
2
+ parser::statement::{Statement, StatementKind},
3
+ preprocessor::module::Module,
4
+ store::global::GlobalStore,
9
5
  };
6
+ use devalang_types::Value;
7
+ use devalang_utils::logger::{LogLevel, Logger};
10
8
 
11
9
  pub fn resolve_spawn(
12
10
  stmt: &Statement,
@@ -33,24 +31,49 @@ pub fn resolve_spawn(
33
31
  }
34
32
 
35
33
  // If it's a group stored in variables
36
- if let Some(variable) = global_store.variables.variables.get(&name) {
37
- if let Value::Statement(stmt_box) = variable {
38
- if let StatementKind::Group = stmt_box.kind {
39
- if let Value::Map(map) = &stmt_box.value {
40
- if let Some(Value::Block(body)) = map.get("body") {
41
- let mut resolved_map = std::collections::HashMap::new();
42
- resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
43
- resolved_map.insert("args".to_string(), Value::Array(args.clone()));
44
- resolved_map.insert("body".to_string(), Value::Block(body.clone()));
34
+ if let Some(Value::Statement(stmt_box)) = global_store.variables.variables.get(&name) {
35
+ if let StatementKind::Group = stmt_box.kind {
36
+ if let Value::Map(map) = &stmt_box.value {
37
+ if let Some(Value::Block(body)) = map.get("body") {
38
+ let mut resolved_map = std::collections::HashMap::new();
39
+ resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
40
+ resolved_map.insert("args".to_string(), Value::Array(args.clone()));
41
+ resolved_map.insert("body".to_string(), Value::Block(body.clone()));
45
42
 
46
- return Statement {
47
- kind: StatementKind::Spawn { name, args },
48
- value: Value::Map(resolved_map),
49
- ..stmt.clone()
50
- };
43
+ return Statement {
44
+ kind: StatementKind::Spawn { name, args },
45
+ value: Value::Map(resolved_map),
46
+ ..stmt.clone()
47
+ };
48
+ }
49
+ }
50
+ }
51
+ // Pattern case (make spawn accept patterns stored as variables)
52
+ if let StatementKind::Pattern { .. } = stmt_box.kind {
53
+ let mut resolved_map = std::collections::HashMap::new();
54
+ resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
55
+ // pattern value may be a string or a map stored on the statement
56
+ match &stmt_box.value {
57
+ Value::String(s) => {
58
+ resolved_map.insert("pattern".to_string(), Value::String(s.clone()));
59
+ }
60
+ Value::Map(m) => {
61
+ if let Some(val) = m.get("pattern") {
62
+ resolved_map.insert("pattern".to_string(), val.clone());
63
+ }
64
+ if let Some(val) = m.get("target") {
65
+ resolved_map.insert("target".to_string(), val.clone());
51
66
  }
52
67
  }
68
+ _ => {}
53
69
  }
70
+ resolved_map.insert("args".to_string(), Value::Array(args.clone()));
71
+
72
+ return Statement {
73
+ kind: StatementKind::Spawn { name, args },
74
+ value: Value::Map(resolved_map),
75
+ ..stmt.clone()
76
+ };
54
77
  }
55
78
  }
56
79
 
@@ -1,12 +1,10 @@
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::{LogLevel, Logger},
1
+ use crate::core::{
2
+ parser::statement::{Statement, StatementKind},
3
+ preprocessor::{module::Module, resolver::driver::resolve_statement},
4
+ store::global::GlobalStore,
9
5
  };
6
+ use devalang_types::Value;
7
+ use devalang_utils::logger::{LogLevel, Logger};
10
8
 
11
9
  pub fn resolve_synth(
12
10
  stmt: &Statement,
@@ -1,12 +1,10 @@
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,
1
+ use crate::core::{
2
+ parser::statement::{Statement, StatementKind},
3
+ preprocessor::module::Module,
4
+ store::global::GlobalStore,
9
5
  };
6
+ use devalang_types::Value;
7
+ use devalang_utils::logger::Logger;
10
8
 
11
9
  pub fn resolve_tempo(
12
10
  stmt: &Statement,
@@ -1,14 +1,11 @@
1
- use std::collections::HashMap;
2
-
3
- use crate::{
4
- core::{
5
- parser::statement::{Statement, StatementKind},
6
- preprocessor::module::Module,
7
- shared::{duration::Duration, value::Value},
8
- store::global::GlobalStore,
9
- },
10
- utils::logger::Logger,
1
+ use crate::core::{
2
+ parser::statement::{Statement, StatementKind},
3
+ preprocessor::module::Module,
4
+ store::global::GlobalStore,
11
5
  };
6
+ use devalang_types::{Duration, Value};
7
+ use devalang_utils::logger::Logger;
8
+ use std::collections::HashMap;
12
9
 
13
10
  pub fn resolve_trigger(
14
11
  stmt: &Statement,
@@ -44,15 +41,21 @@ pub fn resolve_trigger(
44
41
  // Params value resolution
45
42
  let final_value = match &stmt.value {
46
43
  Value::Identifier(ident) => {
47
- println!("Resolving identifier: {}", ident);
44
+ logger.log_message(
45
+ devalang_utils::logger::LogLevel::Debug,
46
+ &format!("Resolving identifier: {}", ident),
47
+ );
48
48
 
49
- resolve_identifier(ident, module, global_store).unwrap_or_else(|| {
50
- logger.log_error_with_stacktrace(
51
- &format!("'{path}': value identifier '{ident}' not found"),
52
- &format!("{}:{}:{}", module.path, stmt.line, stmt.column),
53
- );
54
- Value::Null
55
- })
49
+ match resolve_identifier(ident, module, global_store) {
50
+ Some(v) => v,
51
+ None => {
52
+ logger.log_error_with_stacktrace(
53
+ &format!("'{path}': value identifier '{ident}' not found"),
54
+ &format!("{}:{}:{}", module.path, stmt.line, stmt.column),
55
+ );
56
+ Value::Null
57
+ }
58
+ }
56
59
  }
57
60
  Value::Map(map) => {
58
61
  let mut resolved_map = HashMap::new();
@@ -88,7 +91,7 @@ fn resolve_identifier(ident: &str, module: &Module, global_store: &GlobalStore)
88
91
  return Some(resolve_value(val, module, global_store));
89
92
  }
90
93
 
91
- for (_, other_mod) in &global_store.modules {
94
+ for other_mod in global_store.modules.values() {
92
95
  if let Some(val) = other_mod.variable_table.get(ident) {
93
96
  return Some(resolve_value(val, other_mod, global_store));
94
97
  }