@devaloop/devalang 0.0.1-alpha.9 → 0.0.1-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (322) hide show
  1. package/.cargo/config.toml +2 -0
  2. package/.devalang +6 -1
  3. package/.github/workflows/ci.yml +103 -0
  4. package/Cargo.toml +81 -48
  5. package/README.md +137 -154
  6. package/docs/CHANGELOG.md +428 -1
  7. package/docs/CONTRIBUTING.md +101 -0
  8. package/docs/ROADMAP.md +14 -7
  9. package/docs/TODO.md +16 -15
  10. package/examples/automation.deva +42 -0
  11. package/examples/bank.deva +7 -0
  12. package/examples/bus.deva +10 -0
  13. package/examples/duration.deva +9 -0
  14. package/examples/effect.deva +2 -0
  15. package/examples/events.deva +12 -0
  16. package/examples/filter.deva +11 -0
  17. package/examples/function.deva +15 -0
  18. package/examples/index.deva +57 -12
  19. package/examples/lfo.deva +9 -0
  20. package/examples/loop.deva +5 -12
  21. package/examples/pattern.deva +8 -0
  22. package/examples/plugin.deva +16 -0
  23. package/examples/synth.deva +11 -1
  24. package/examples/synth_types.deva +17 -0
  25. package/examples/variables.deva +1 -1
  26. package/out-tsc/bin/index.d.ts +2 -0
  27. package/out-tsc/bin/index.js +51 -7
  28. package/out-tsc/core/functions/index.d.ts +42 -0
  29. package/out-tsc/core/functions/index.js +87 -0
  30. package/out-tsc/core/index.d.ts +6 -0
  31. package/out-tsc/core/index.js +22 -0
  32. package/out-tsc/core/types/index.d.ts +4 -0
  33. package/out-tsc/core/types/index.js +20 -0
  34. package/out-tsc/core/types/plugin.d.ts +18 -0
  35. package/out-tsc/core/types/plugin.js +2 -0
  36. package/out-tsc/core/types/result.d.ts +27 -0
  37. package/out-tsc/core/types/result.js +2 -0
  38. package/out-tsc/core/types/statement.d.ts +106 -0
  39. package/out-tsc/core/types/statement.js +2 -0
  40. package/out-tsc/core/types/value.d.ts +43 -0
  41. package/out-tsc/core/types/value.js +2 -0
  42. package/out-tsc/index.d.ts +7 -0
  43. package/out-tsc/index.js +42 -1
  44. package/out-tsc/pkg/devalang_core.d.ts +15 -0
  45. package/out-tsc/pkg/devalang_core.js +65 -0
  46. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +34 -0
  47. package/out-tsc/scripts/copy-wasm-dts.d.ts +1 -0
  48. package/out-tsc/scripts/copy-wasm-dts.js +73 -0
  49. package/out-tsc/scripts/postinstall.d.ts +1 -0
  50. package/out-tsc/scripts/postinstall.js +83 -0
  51. package/out-tsc/scripts/version/bump.d.ts +1 -0
  52. package/out-tsc/scripts/version/fetch.d.ts +1 -0
  53. package/out-tsc/scripts/version/index.d.ts +1 -0
  54. package/out-tsc/scripts/version/sync.d.ts +1 -0
  55. package/package.json +28 -7
  56. package/project-version.json +4 -4
  57. package/rust/cli/bank/api.rs +122 -0
  58. package/rust/cli/bank/commands.rs +306 -0
  59. package/rust/cli/bank/mod.rs +29 -0
  60. package/rust/cli/build/commands.rs +153 -0
  61. package/rust/cli/build/mod.rs +2 -0
  62. package/rust/cli/build/process.rs +165 -0
  63. package/rust/cli/check/mod.rs +208 -0
  64. package/rust/cli/discover/commands.rs +253 -0
  65. package/rust/cli/discover/config.rs +111 -0
  66. package/rust/cli/discover/fs.rs +19 -0
  67. package/rust/cli/discover/install.rs +103 -0
  68. package/rust/cli/discover/metadata.rs +48 -0
  69. package/rust/cli/discover/mod.rs +5 -0
  70. package/rust/cli/{init.rs → init/commands.rs} +32 -23
  71. package/rust/cli/init/mod.rs +1 -0
  72. package/rust/cli/install/addon.rs +118 -0
  73. package/rust/cli/install/bank.rs +72 -0
  74. package/rust/cli/install/commands.rs +35 -0
  75. package/rust/cli/install/mod.rs +4 -0
  76. package/rust/cli/install/plugin.rs +80 -0
  77. package/rust/cli/login/commands.rs +124 -0
  78. package/rust/cli/login/mod.rs +1 -0
  79. package/rust/cli/mod.rs +9 -202
  80. package/rust/cli/parser.rs +359 -0
  81. package/rust/cli/play/commands.rs +375 -0
  82. package/rust/cli/play/io.rs +17 -0
  83. package/rust/cli/play/mod.rs +5 -0
  84. package/rust/cli/play/process.rs +159 -0
  85. package/rust/cli/play/realtime.rs +91 -0
  86. package/rust/cli/play/utils.rs +23 -0
  87. package/rust/cli/telemetry/commands.rs +22 -0
  88. package/rust/cli/telemetry/event_creator.rs +80 -0
  89. package/rust/cli/telemetry/mod.rs +3 -0
  90. package/rust/cli/telemetry/send.rs +51 -0
  91. package/rust/cli/{template.rs → template/commands.rs} +17 -5
  92. package/rust/cli/template/mod.rs +1 -0
  93. package/rust/cli/update/commands.rs +6 -0
  94. package/rust/cli/update/mod.rs +1 -0
  95. package/rust/config/driver.rs +112 -0
  96. package/rust/config/mod.rs +3 -16
  97. package/rust/config/ops.rs +26 -0
  98. package/rust/config/settings.rs +101 -0
  99. package/rust/core/audio/engine/driver.rs +220 -0
  100. package/rust/core/audio/engine/export.rs +169 -0
  101. package/rust/core/audio/engine/helpers.rs +178 -0
  102. package/rust/core/audio/engine/mod.rs +56 -0
  103. package/rust/core/audio/engine/notes/dsp.rs +85 -0
  104. package/rust/core/audio/engine/notes/mod.rs +44 -0
  105. package/rust/core/audio/engine/notes/params.rs +294 -0
  106. package/rust/core/audio/engine/sample/insert.rs +199 -0
  107. package/rust/core/audio/engine/sample/mod.rs +40 -0
  108. package/rust/core/audio/engine/sample/padding.rs +170 -0
  109. package/rust/core/audio/evaluator/condition.rs +61 -0
  110. package/rust/core/audio/evaluator/mod.rs +9 -0
  111. package/rust/core/audio/evaluator/numeric.rs +152 -0
  112. package/rust/core/audio/evaluator/rhs.rs +16 -0
  113. package/rust/core/audio/evaluator/string_expr.rs +94 -0
  114. package/rust/core/audio/interpreter/driver.rs +574 -216
  115. package/rust/core/audio/interpreter/mod.rs +2 -12
  116. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +175 -0
  117. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +384 -0
  118. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +2 -0
  119. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +316 -0
  120. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +3 -0
  121. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +192 -0
  122. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +24 -0
  123. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +116 -0
  124. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +97 -0
  125. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +100 -0
  126. package/rust/core/audio/interpreter/statements/automate.rs +16 -0
  127. package/rust/core/audio/interpreter/statements/call.rs +295 -0
  128. package/rust/core/audio/interpreter/{condition.rs → statements/condition.rs} +72 -69
  129. package/rust/core/audio/interpreter/statements/function.rs +24 -0
  130. package/rust/core/audio/interpreter/statements/let_.rs +36 -0
  131. package/rust/core/audio/interpreter/statements/load.rs +17 -0
  132. package/rust/core/audio/interpreter/statements/loop_.rs +115 -0
  133. package/rust/core/audio/interpreter/statements/mod.rs +12 -0
  134. package/rust/core/audio/interpreter/statements/sleep.rs +28 -0
  135. package/rust/core/audio/interpreter/statements/spawn.rs +253 -0
  136. package/rust/core/audio/interpreter/statements/tempo.rs +40 -0
  137. package/rust/core/audio/interpreter/statements/trigger.rs +239 -0
  138. package/rust/core/audio/loader/mod.rs +1 -1
  139. package/rust/core/audio/loader/trigger.rs +98 -52
  140. package/rust/core/audio/mod.rs +2 -2
  141. package/rust/core/audio/player.rs +28 -12
  142. package/rust/core/audio/special/easing.rs +189 -0
  143. package/rust/core/audio/special/env.rs +45 -0
  144. package/rust/core/audio/special/math.rs +134 -0
  145. package/rust/core/audio/special/mod.rs +9 -0
  146. package/rust/core/audio/special/modulator.rs +143 -0
  147. package/rust/core/builder/mod.rs +129 -80
  148. package/rust/core/debugger/lexer.rs +4 -4
  149. package/rust/core/debugger/logs.rs +52 -0
  150. package/rust/core/debugger/mod.rs +11 -2
  151. package/rust/core/debugger/preprocessor.rs +4 -4
  152. package/rust/core/debugger/store.rs +38 -25
  153. package/rust/core/error/mod.rs +221 -12
  154. package/rust/core/lexer/driver.rs +59 -0
  155. package/rust/core/lexer/handler/arrow.rs +62 -11
  156. package/rust/core/lexer/handler/at.rs +5 -5
  157. package/rust/core/lexer/handler/brace.rs +11 -11
  158. package/rust/core/lexer/handler/colon.rs +5 -5
  159. package/rust/core/lexer/handler/comment.rs +3 -3
  160. package/rust/core/lexer/handler/dot.rs +6 -6
  161. package/rust/core/lexer/handler/driver.rs +143 -32
  162. package/rust/core/lexer/handler/identifier.rs +11 -5
  163. package/rust/core/lexer/handler/indent.rs +18 -4
  164. package/rust/core/lexer/handler/mod.rs +6 -5
  165. package/rust/core/lexer/handler/newline.rs +3 -3
  166. package/rust/core/lexer/handler/number.rs +5 -5
  167. package/rust/core/lexer/handler/operator.rs +5 -3
  168. package/rust/core/lexer/handler/parenthesis.rs +41 -0
  169. package/rust/core/lexer/handler/slash.rs +21 -0
  170. package/rust/core/lexer/handler/string.rs +3 -3
  171. package/rust/core/lexer/mod.rs +1 -49
  172. package/rust/core/lexer/token.rs +17 -12
  173. package/rust/core/mod.rs +9 -10
  174. package/rust/core/parser/driver/block.rs +111 -0
  175. package/rust/core/parser/driver/cursor.rs +82 -0
  176. package/rust/core/parser/driver/driver_impl.rs +139 -0
  177. package/rust/core/parser/driver/mod.rs +6 -0
  178. package/rust/core/parser/driver/parse_array.rs +120 -0
  179. package/rust/core/parser/driver/parse_map.rs +223 -0
  180. package/rust/core/parser/driver/parser.rs +160 -0
  181. package/rust/core/parser/handler/arrow_call.rs +277 -126
  182. package/rust/core/parser/handler/at.rs +142 -25
  183. package/rust/core/parser/handler/bank.rs +83 -20
  184. package/rust/core/parser/handler/condition.rs +14 -5
  185. package/rust/core/parser/handler/dot.rs +111 -75
  186. package/rust/core/parser/handler/identifier/automate.rs +254 -0
  187. package/rust/core/parser/handler/identifier/call.rs +74 -24
  188. package/rust/core/parser/handler/identifier/emit.rs +70 -0
  189. package/rust/core/parser/handler/identifier/function.rs +113 -0
  190. package/rust/core/parser/handler/identifier/group.rs +28 -14
  191. package/rust/core/parser/handler/identifier/let_.rs +61 -21
  192. package/rust/core/parser/handler/identifier/mod.rs +24 -20
  193. package/rust/core/parser/handler/identifier/on.rs +107 -0
  194. package/rust/core/parser/handler/identifier/print.rs +49 -0
  195. package/rust/core/parser/handler/identifier/sleep.rs +77 -14
  196. package/rust/core/parser/handler/identifier/spawn.rs +81 -31
  197. package/rust/core/parser/handler/identifier/synth.rs +102 -32
  198. package/rust/core/parser/handler/loop_.rs +144 -22
  199. package/rust/core/parser/handler/mod.rs +6 -5
  200. package/rust/core/parser/handler/pattern.rs +74 -0
  201. package/rust/core/parser/handler/tempo.rs +67 -9
  202. package/rust/core/parser/mod.rs +3 -4
  203. package/rust/core/parser/statement.rs +6 -92
  204. package/rust/core/plugin/loader.rs +137 -0
  205. package/rust/core/plugin/mod.rs +2 -0
  206. package/rust/core/plugin/runner/mod.rs +11 -0
  207. package/rust/core/plugin/runner/non_wasm.rs +297 -0
  208. package/rust/core/plugin/runner/wasm32.rs +43 -0
  209. package/rust/core/preprocessor/loader/inject.rs +278 -0
  210. package/rust/core/preprocessor/loader/loader_helpers.rs +110 -0
  211. package/rust/core/preprocessor/loader/mod.rs +235 -0
  212. package/rust/core/preprocessor/mod.rs +4 -4
  213. package/rust/core/preprocessor/module.rs +55 -50
  214. package/rust/core/preprocessor/processor/handlers.rs +107 -0
  215. package/rust/core/preprocessor/processor/mod.rs +1 -0
  216. package/rust/core/preprocessor/resolver/bank.rs +14 -12
  217. package/rust/core/preprocessor/resolver/call.rs +106 -105
  218. package/rust/core/preprocessor/resolver/condition.rs +13 -10
  219. package/rust/core/preprocessor/resolver/driver.rs +145 -48
  220. package/rust/core/preprocessor/resolver/function.rs +69 -0
  221. package/rust/core/preprocessor/resolver/group.rs +122 -61
  222. package/rust/core/preprocessor/resolver/let_.rs +13 -12
  223. package/rust/core/preprocessor/resolver/loop_.rs +240 -13
  224. package/rust/core/preprocessor/resolver/mod.rs +8 -6
  225. package/rust/core/preprocessor/resolver/pattern.rs +83 -0
  226. package/rust/core/preprocessor/resolver/spawn.rs +83 -42
  227. package/rust/core/preprocessor/resolver/synth.rs +15 -11
  228. package/rust/core/preprocessor/resolver/tempo.rs +13 -14
  229. package/rust/core/preprocessor/resolver/trigger.rs +32 -28
  230. package/rust/core/preprocessor/resolver/value.rs +111 -13
  231. package/rust/core/store/global.rs +57 -39
  232. package/rust/core/store/mod.rs +0 -3
  233. package/rust/lib.rs +323 -117
  234. package/rust/main.rs +388 -65
  235. package/rust/types/Cargo.toml +11 -0
  236. package/rust/types/src/addons.rs +55 -0
  237. package/rust/types/src/ast.rs +202 -0
  238. package/rust/types/src/config.rs +84 -0
  239. package/rust/types/src/lib.rs +15 -0
  240. package/rust/types/src/plugin.rs +20 -0
  241. package/rust/types/src/store.rs +139 -0
  242. package/rust/types/src/telemetry.rs +85 -0
  243. package/rust/utils/Cargo.toml +26 -0
  244. package/rust/utils/src/error.rs +186 -0
  245. package/rust/utils/src/file.rs +94 -0
  246. package/rust/utils/src/first_usage.rs +97 -0
  247. package/rust/utils/{mod.rs → src/lib.rs} +6 -3
  248. package/rust/utils/{logger.rs → src/logger.rs} +94 -17
  249. package/rust/utils/src/path.rs +129 -0
  250. package/rust/utils/src/signature.rs +41 -0
  251. package/rust/utils/{spinner.rs → src/spinner.rs} +7 -8
  252. package/rust/utils/src/version.rs +27 -0
  253. package/rust/utils/{watcher.rs → src/watcher.rs} +17 -4
  254. package/rust/web/api.rs +5 -0
  255. package/rust/web/cdn.rs +34 -0
  256. package/rust/web/mod.rs +3 -0
  257. package/rust/web/sso.rs +5 -0
  258. package/templates/minimal/README.md +143 -127
  259. package/templates/welcome/README.md +143 -127
  260. package/templates/welcome/src/index.deva +56 -8
  261. package/templates/welcome/src/variables.deva +2 -4
  262. package/tests/integration.rs +21 -0
  263. package/tests/rust/cli_check_build.rs +21 -0
  264. package/tests/rust/cli_help.rs +12 -0
  265. package/tests/rust/cli_template_list.rs +10 -0
  266. package/tests/rust/cli_version.rs +11 -0
  267. package/tests/typescript/index.spec.ts +136 -0
  268. package/tests/typescript/playhead.spec.ts +36 -0
  269. package/tests/typescript/render_e2e.spec.ts +77 -0
  270. package/tsconfig.json +12 -10
  271. package/typescript/bin/index.ts +19 -5
  272. package/typescript/core/functions/index.ts +94 -0
  273. package/typescript/core/index.ts +6 -0
  274. package/typescript/core/types/index.ts +4 -0
  275. package/typescript/core/types/plugin.ts +19 -0
  276. package/typescript/core/types/result.ts +29 -0
  277. package/typescript/core/types/statement.ts +47 -0
  278. package/typescript/core/types/value.ts +29 -0
  279. package/typescript/index.ts +8 -1
  280. package/typescript/pkg/devalang_core.d.ts +4 -0
  281. package/typescript/pkg/devalang_core.ts +65 -0
  282. package/typescript/scripts/copy-wasm-dts.ts +41 -0
  283. package/typescript/scripts/postinstall.ts +85 -0
  284. package/typescript/scripts/version/bump.ts +0 -1
  285. package/typescript/scripts/version/index.ts +0 -1
  286. package/docs/COMMANDS.md +0 -85
  287. package/docs/CONFIG.md +0 -30
  288. package/docs/SYNTAX.md +0 -210
  289. package/out-tsc/bin/devalang.exe +0 -0
  290. package/out-tsc/scripts/postbuild.js +0 -11
  291. package/rust/cli/build.rs +0 -137
  292. package/rust/cli/check.rs +0 -117
  293. package/rust/cli/play.rs +0 -193
  294. package/rust/config/loader.rs +0 -13
  295. package/rust/core/audio/engine.rs +0 -203
  296. package/rust/core/audio/evaluator.rs +0 -31
  297. package/rust/core/audio/interpreter/arrow_call.rs +0 -129
  298. package/rust/core/audio/interpreter/call.rs +0 -64
  299. package/rust/core/audio/interpreter/let_.rs +0 -19
  300. package/rust/core/audio/interpreter/load.rs +0 -18
  301. package/rust/core/audio/interpreter/loop_.rs +0 -67
  302. package/rust/core/audio/interpreter/sleep.rs +0 -36
  303. package/rust/core/audio/interpreter/spawn.rs +0 -66
  304. package/rust/core/audio/interpreter/tempo.rs +0 -16
  305. package/rust/core/audio/interpreter/trigger.rs +0 -69
  306. package/rust/core/audio/renderer.rs +0 -54
  307. package/rust/core/parser/driver.rs +0 -331
  308. package/rust/core/preprocessor/loader.rs +0 -193
  309. package/rust/core/preprocessor/processor.rs +0 -76
  310. package/rust/core/shared/duration.rs +0 -8
  311. package/rust/core/shared/mod.rs +0 -2
  312. package/rust/core/shared/value.rs +0 -18
  313. package/rust/core/store/export.rs +0 -28
  314. package/rust/core/store/import.rs +0 -28
  315. package/rust/core/store/variable.rs +0 -28
  316. package/rust/core/utils/mod.rs +0 -2
  317. package/rust/core/utils/path.rs +0 -31
  318. package/rust/core/utils/validation.rs +0 -37
  319. package/rust/utils/file.rs +0 -35
  320. package/rust/utils/signature.rs +0 -17
  321. package/rust/utils/version.rs +0 -15
  322. package/typescript/scripts/postbuild.ts +0 -8
@@ -1,50 +1,55 @@
1
- use crate::core::{
2
- lexer::token::Token,
3
- parser::statement::Statement,
4
- store::{ export::ExportTable, 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 export_table: ExportTable,
15
- pub import_table: ImportTable,
16
- pub content: String,
17
- pub current_dir: String,
18
- }
19
-
20
- impl Module {
21
- pub fn new(path: &str) -> Self {
22
- Module {
23
- path: path.to_string(),
24
- tokens: Vec::new(),
25
- statements: Vec::new(),
26
- variable_table: VariableTable::new(),
27
- export_table: ExportTable::new(),
28
- import_table: ImportTable::new(),
29
- resolved: false,
30
- content: String::new(),
31
- current_dir: String::new(),
32
- }
33
- }
34
-
35
- pub fn is_resolved(&self) -> bool {
36
- self.resolved
37
- }
38
-
39
- pub fn set_resolved(&mut self, resolved: bool) {
40
- self.resolved = resolved;
41
- }
42
-
43
- pub fn add_token(&mut self, token: Token) {
44
- self.tokens.push(token);
45
- }
46
-
47
- pub fn add_statement(&mut self, statement: Statement) {
48
- self.statements.push(statement);
49
- }
50
- }
1
+ use crate::core::{lexer::token::Token, parser::statement::Statement};
2
+ use devalang_types::{ExportTable, FunctionTable, ImportTable, VariableTable};
3
+
4
+ #[derive(Debug, Clone)]
5
+ pub struct Module {
6
+ pub path: String,
7
+ pub resolved: bool,
8
+ pub tokens: Vec<Token>,
9
+ pub statements: Vec<Statement>,
10
+ pub variable_table: VariableTable,
11
+ pub function_table: FunctionTable,
12
+ pub export_table: ExportTable,
13
+ pub import_table: ImportTable,
14
+ pub content: String,
15
+ pub current_dir: String,
16
+ }
17
+
18
+ impl Module {
19
+ pub fn new(path: &str) -> Self {
20
+ Module {
21
+ path: path.to_string(),
22
+ tokens: Vec::new(),
23
+ statements: Vec::new(),
24
+ variable_table: VariableTable::new(),
25
+ function_table: FunctionTable::new(),
26
+ export_table: ExportTable::new(),
27
+ import_table: ImportTable::new(),
28
+ resolved: false,
29
+ content: String::new(),
30
+ current_dir: String::new(),
31
+ }
32
+ }
33
+
34
+ pub fn is_resolved(&self) -> bool {
35
+ self.resolved
36
+ }
37
+
38
+ pub fn set_resolved(&mut self, resolved: bool) {
39
+ self.resolved = resolved;
40
+ }
41
+
42
+ pub fn add_token(&mut self, token: Token) {
43
+ self.tokens.push(token);
44
+ }
45
+
46
+ pub fn add_statement(&mut self, statement: Statement) {
47
+ self.statements.push(statement);
48
+ }
49
+
50
+ pub fn from_existing(path: &str, content: String) -> Self {
51
+ let mut module = Module::new(path);
52
+ module.content = content;
53
+ module
54
+ }
55
+ }
@@ -0,0 +1,107 @@
1
+ use crate::core::{
2
+ parser::statement::StatementKind, preprocessor::loader::ModuleLoader,
3
+ store::global::GlobalStore,
4
+ };
5
+ use devalang_types::Value;
6
+ use devalang_utils::path::{normalize_path, resolve_relative_path};
7
+ use std::collections::HashMap;
8
+
9
+ pub fn process_modules(_module_loader: &ModuleLoader, global_store: &mut GlobalStore) {
10
+ for module in global_store.modules.values_mut() {
11
+ let logger = devalang_utils::logger::Logger::new();
12
+ use devalang_utils::logger::LogLevel;
13
+
14
+ for stmt in &module.statements {
15
+ match &stmt.kind {
16
+ StatementKind::Let { name } => {
17
+ if let Value::Null = stmt.value {
18
+ logger.log_message(
19
+ LogLevel::Error,
20
+ &format!("Variable '{}' is declared but not initialized.", name),
21
+ );
22
+ module.variable_table.variables.insert(
23
+ name.clone(),
24
+ Value::StatementKind(Box::new(stmt.kind.clone())),
25
+ );
26
+ continue;
27
+ }
28
+
29
+ if module.variable_table.get(name).is_some() {
30
+ logger.log_message(
31
+ LogLevel::Error,
32
+ &format!("Variable '{}' is already defined in this scope.", name),
33
+ );
34
+ continue;
35
+ }
36
+
37
+ if let Some(module_variable) = module.variable_table.variables.get(name) {
38
+ logger.log_message(
39
+ LogLevel::Error,
40
+ &format!(
41
+ "Variable '{}' is already defined globally with value: {:?}",
42
+ name, module_variable
43
+ ),
44
+ );
45
+ continue;
46
+ }
47
+
48
+ module
49
+ .variable_table
50
+ .variables
51
+ .insert(name.clone(), stmt.value.clone());
52
+ }
53
+
54
+ StatementKind::Load { source, alias } => {
55
+ let module_dir = std::path::Path::new(&module.path)
56
+ .parent()
57
+ .unwrap_or(std::path::Path::new(""));
58
+ let resolved_path = normalize_path(module_dir.join(source));
59
+ module
60
+ .variable_table
61
+ .variables
62
+ .insert(alias.clone(), Value::Sample(resolved_path));
63
+ }
64
+
65
+ StatementKind::Export { names, source: _ } => {
66
+ for name in names {
67
+ if let Some(val) = module.variable_table.get(name) {
68
+ module.export_table.add_export(name.clone(), val.clone());
69
+ }
70
+ }
71
+ }
72
+
73
+ StatementKind::Import { names, source } => {
74
+ let resolved = resolve_relative_path(&module.path, source);
75
+ for name in names {
76
+ module
77
+ .import_table
78
+ .add_import(name.clone(), Value::String(resolved.clone()));
79
+ }
80
+ }
81
+
82
+ StatementKind::Group => {
83
+ if let Value::Map(map) = &stmt.value {
84
+ if let (Some(Value::String(name)), Some(Value::Block(body))) =
85
+ (map.get("identifier"), map.get("body"))
86
+ {
87
+ let mut stored_map = HashMap::new();
88
+ stored_map
89
+ .insert("identifier".to_string(), Value::String(name.clone()));
90
+ stored_map.insert("body".to_string(), Value::Block(body.clone()));
91
+ module
92
+ .variable_table
93
+ .set(name.to_string(), Value::Map(stored_map));
94
+ } else {
95
+ logger.log_message(
96
+ LogLevel::Error,
97
+ &format!("Invalid group definition: {:?}", stmt.value),
98
+ );
99
+ }
100
+ }
101
+ }
102
+
103
+ _ => {}
104
+ }
105
+ }
106
+ }
107
+ }
@@ -0,0 +1 @@
1
+ pub mod handlers;
@@ -1,22 +1,19 @@
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_bank(
12
10
  stmt: &Statement,
13
11
  module: &Module,
14
- path: &str,
15
- _global_store: &GlobalStore
12
+ _path: &str,
13
+ _global_store: &GlobalStore,
16
14
  ) -> Statement {
17
15
  let mut new_stmt = stmt.clone();
18
16
  let logger = Logger::new();
19
-
20
17
  match &stmt.value {
21
18
  Value::Identifier(ident) => {
22
19
  if let Some(val) = module.variable_table.get(ident) {
@@ -33,8 +30,13 @@ pub fn resolve_bank(
33
30
 
34
31
  Value::String(_) => {}
35
32
 
33
+ Value::Number(_) => {}
34
+
36
35
  other => {
37
- let message = format!("Expected a string or identifier for bank, found {:?}", other);
36
+ let message = format!(
37
+ "Expected a string or identifier for bank, found {:?}",
38
+ other
39
+ );
38
40
  logger.log_error_with_stacktrace(&message, &module.path);
39
41
  new_stmt.kind = StatementKind::Error {
40
42
  message: "Expected a string or identifier for bank".to_string(),
@@ -1,123 +1,124 @@
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 },
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,
11
+ name: String,
12
+ args: Vec<Value>,
13
13
  module: &Module,
14
- path: &str,
15
- global_store: &mut GlobalStore
14
+ _path: &str,
15
+ global_store: &mut GlobalStore,
16
16
  ) -> Statement {
17
17
  let logger = Logger::new();
18
18
 
19
- match &stmt.value {
20
- Value::Identifier(ident) => {
21
- match module.variable_table.get(ident) {
22
- Some(Value::String(group_name)) =>
23
- resolve_group_by_name(group_name, stmt, module, path, global_store, &logger),
24
- Some(Value::Map(group_map)) =>
25
- resolved_call(stmt, group_map, module, path, global_store),
26
- Some(other) =>
27
- error_stmt(
28
- &logger,
29
- module,
30
- stmt,
31
- &format!(
32
- "Identifier '{ident}' must resolve to a group name or map, found {:?}",
33
- other
34
- )
35
- ),
36
- None =>
37
- error_stmt(
38
- &logger,
39
- module,
40
- stmt,
41
- &format!("Identifier '{ident}' not found in variable table")
19
+ match &stmt.kind {
20
+ StatementKind::Call { .. } => {
21
+ // Check if it's a function
22
+ if let Some(func) = global_store.functions.functions.get(&name) {
23
+ let mut call_map = std::collections::HashMap::new();
24
+ call_map.insert("name".to_string(), Value::Identifier(name.clone()));
25
+ call_map.insert(
26
+ "parameters".to_string(),
27
+ Value::Array(
28
+ func.parameters
29
+ .iter()
30
+ .map(|p| Value::Identifier(p.clone()))
31
+ .collect(),
42
32
  ),
43
- }
44
- }
33
+ );
34
+ call_map.insert("args".to_string(), Value::Array(args.clone()));
35
+ call_map.insert("body".to_string(), Value::Block(func.body.clone()));
45
36
 
46
- Value::String(name) =>
47
- resolve_group_by_name(name, stmt, module, path, global_store, &logger),
37
+ return Statement {
38
+ kind: StatementKind::Call { name, args },
39
+ value: Value::Map(call_map),
40
+ ..stmt.clone()
41
+ };
42
+ }
48
43
 
49
- Value::Map(group_map) => resolved_call(stmt, group_map, module, path, global_store),
44
+ // Otherwise, check if it's a variable (e.g. group)
45
+ if let Some(Value::Statement(stmt_box)) = global_store.variables.variables.get(&name) {
46
+ if let StatementKind::Group = stmt_box.kind {
47
+ if let Value::Map(map) = &stmt_box.value {
48
+ if let Some(Value::Block(body)) = map.get("body") {
49
+ let mut resolved_map = std::collections::HashMap::new();
50
+ resolved_map
51
+ .insert("identifier".to_string(), Value::String(name.clone()));
52
+ resolved_map.insert("args".to_string(), Value::Array(args.clone()));
53
+ resolved_map.insert("body".to_string(), Value::Block(body.clone()));
50
54
 
51
- other =>
52
- error_stmt(
53
- &logger,
54
- module,
55
- stmt,
56
- &format!("Call expects a group name as string or identifier, found {:?}", other)
57
- ),
58
- }
59
- }
60
-
61
- fn resolve_group_by_name(
62
- name: &str,
63
- stmt: &Statement,
64
- module: &Module,
65
- path: &str,
66
- global_store: &mut GlobalStore,
67
- logger: &Logger
68
- ) -> Statement {
69
- match module.variable_table.get(name) {
70
- Some(Value::Map(group_map)) => resolved_call(stmt, group_map, module, path, global_store),
71
- Some(other) =>
72
- error_stmt(
73
- logger,
74
- module,
75
- stmt,
76
- &format!("Expected a group for '{}', but found {:?}", name, other)
77
- ),
78
- None =>
79
- error_stmt(
80
- logger,
81
- module,
82
- stmt,
83
- &format!("Group '{}' not found in module '{}'", name, module.path)
84
- ),
85
- }
86
- }
55
+ return Statement {
56
+ kind: StatementKind::Call { name, args },
57
+ value: Value::Map(resolved_map),
58
+ ..stmt.clone()
59
+ };
60
+ }
61
+ }
62
+ }
63
+ // Pattern case
64
+ if let StatementKind::Pattern { .. } = stmt_box.kind {
65
+ // pattern value may be a string or a map stored on the statement
66
+ let mut resolved_map = std::collections::HashMap::new();
67
+ resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
68
+ // pattern value
69
+ match &stmt_box.value {
70
+ Value::String(s) => {
71
+ resolved_map.insert("pattern".to_string(), Value::String(s.clone()));
72
+ }
73
+ Value::Map(m) => {
74
+ if let Some(val) = m.get("pattern") {
75
+ resolved_map.insert("pattern".to_string(), val.clone());
76
+ }
77
+ if let Some(val) = m.get("target") {
78
+ resolved_map.insert("target".to_string(), val.clone());
79
+ }
80
+ }
81
+ _ => {}
82
+ }
83
+ resolved_map.insert("args".to_string(), Value::Array(args.clone()));
87
84
 
88
- fn resolved_call(
89
- stmt: &Statement,
90
- group_map: &std::collections::HashMap<String, Value>,
91
- module: &Module,
92
- path: &str,
93
- global_store: &mut GlobalStore
94
- ) -> Statement {
95
- let mut cloned_map = group_map.clone();
85
+ return Statement {
86
+ kind: StatementKind::Call { name, args },
87
+ value: Value::Map(resolved_map),
88
+ ..stmt.clone()
89
+ };
90
+ }
91
+ }
96
92
 
97
- if let Some(Value::Block(stmts)) = group_map.get("body") {
98
- let resolved = stmts
99
- .iter()
100
- .map(|s| resolve_statement(s, module, path, global_store))
101
- .collect();
102
- cloned_map.insert("body".to_string(), Value::Block(resolved));
103
- }
93
+ // Otherwise, log an error
94
+ logger.log_message(
95
+ LogLevel::Error,
96
+ &format!("Function or group '{}' not found", name),
97
+ );
98
+ Statement {
99
+ kind: StatementKind::Error {
100
+ message: format!("Function or group '{}' not found", name),
101
+ },
102
+ value: Value::Null,
103
+ ..stmt.clone()
104
+ }
105
+ }
106
+ _ => {
107
+ let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
108
+ logger.log_message(
109
+ LogLevel::Error,
110
+ &format!("Expected StatementKind::Call in resolve_call()\n → at {stacktrace}"),
111
+ );
104
112
 
105
- Statement {
106
- kind: StatementKind::Call,
107
- value: Value::Map(cloned_map),
108
- ..stmt.clone()
113
+ Statement {
114
+ kind: StatementKind::Error {
115
+ message: "Expected StatementKind::Call in resolve_call()".to_string(),
116
+ },
117
+ value: Value::Null,
118
+ ..stmt.clone()
119
+ }
120
+ }
109
121
  }
110
122
  }
111
123
 
112
- fn error_stmt(logger: &Logger, module: &Module, stmt: &Statement, message: &str) -> Statement {
113
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
114
- logger.log_message(LogLevel::Error, &format!("{message}\n → at {stacktrace}"));
115
-
116
- Statement {
117
- kind: StatementKind::Error {
118
- message: message.to_string(),
119
- },
120
- value: Value::Null,
121
- ..stmt.clone()
122
- }
123
- }
124
+ // (removed unused helpers get_group_body, error_stmt)
@@ -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,
@@ -17,7 +15,12 @@ pub fn resolve_condition(
17
15
  let logger = Logger::new();
18
16
 
19
17
  let Value::Map(condition_map) = &stmt.value else {
20
- return type_error(&logger, module, stmt, "Expected a map in condition statement".to_string());
18
+ return type_error(
19
+ &logger,
20
+ module,
21
+ stmt,
22
+ "Expected a map in condition statement".to_string(),
23
+ );
21
24
  };
22
25
 
23
26
  let mut resolved_map = condition_map.clone();
@@ -66,7 +69,7 @@ fn resolve_block_statements(
66
69
  .flat_map(|stmt| {
67
70
  let resolved = resolve_statement(stmt, module, path, global_store);
68
71
 
69
- if let StatementKind::Call = resolved.kind {
72
+ if let StatementKind::Call { .. } = resolved.kind {
70
73
  if let Value::Block(inner) = &resolved.value {
71
74
  return inner
72
75
  .iter()