@devaloop/devalang 0.0.1-beta.3 → 0.1.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 (346) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +251 -221
  3. package/out-tsc/api.d.ts +180 -0
  4. package/out-tsc/api.d.ts.map +1 -0
  5. package/out-tsc/api.js +286 -0
  6. package/out-tsc/api.js.map +1 -0
  7. package/out-tsc/bin/index.d.ts +12 -0
  8. package/out-tsc/bin/index.d.ts.map +1 -0
  9. package/out-tsc/bin/index.js +20 -54
  10. package/out-tsc/bin/index.js.map +1 -0
  11. package/out-tsc/examples/basic-usage.d.ts +8 -0
  12. package/out-tsc/examples/basic-usage.d.ts.map +1 -0
  13. package/out-tsc/examples/basic-usage.js +113 -0
  14. package/out-tsc/examples/basic-usage.js.map +1 -0
  15. package/out-tsc/index.d.ts +19 -5
  16. package/out-tsc/index.d.ts.map +1 -0
  17. package/out-tsc/index.js +24 -6
  18. package/out-tsc/index.js.map +1 -0
  19. package/out-tsc/scripts/copy-wasm-dts.d.ts +7 -0
  20. package/out-tsc/scripts/copy-wasm-dts.d.ts.map +1 -0
  21. package/out-tsc/scripts/copy-wasm-dts.js +36 -32
  22. package/out-tsc/scripts/copy-wasm-dts.js.map +1 -0
  23. package/out-tsc/scripts/postinstall.d.ts +1 -0
  24. package/out-tsc/scripts/postinstall.d.ts.map +1 -0
  25. package/out-tsc/scripts/postinstall.js +4 -1
  26. package/out-tsc/scripts/postinstall.js.map +1 -0
  27. package/out-tsc/scripts/version/bump.d.ts +5 -1
  28. package/out-tsc/scripts/version/bump.d.ts.map +1 -0
  29. package/out-tsc/scripts/version/bump.js +122 -44
  30. package/out-tsc/scripts/version/bump.js.map +1 -0
  31. package/out-tsc/scripts/version/fetch.d.ts +12 -1
  32. package/out-tsc/scripts/version/fetch.d.ts.map +1 -0
  33. package/out-tsc/scripts/version/fetch.js +68 -24
  34. package/out-tsc/scripts/version/fetch.js.map +1 -0
  35. package/out-tsc/scripts/version/index.d.ts +6 -0
  36. package/out-tsc/scripts/version/index.d.ts.map +1 -0
  37. package/out-tsc/scripts/version/index.js +44 -22
  38. package/out-tsc/scripts/version/index.js.map +1 -0
  39. package/out-tsc/scripts/version/sync.d.ts +5 -1
  40. package/out-tsc/scripts/version/sync.d.ts.map +1 -0
  41. package/out-tsc/scripts/version/sync.js +95 -29
  42. package/out-tsc/scripts/version/sync.js.map +1 -0
  43. package/out-tsc/types.d.ts +68 -0
  44. package/out-tsc/types.d.ts.map +1 -0
  45. package/out-tsc/{core/types/value.js → types.js} +4 -0
  46. package/out-tsc/types.js.map +1 -0
  47. package/out-tsc/wasm.d.ts +8 -0
  48. package/out-tsc/wasm.d.ts.map +1 -0
  49. package/out-tsc/{core/index.js → wasm.js} +9 -6
  50. package/out-tsc/wasm.js.map +1 -0
  51. package/package.json +42 -42
  52. package/.cargo/config.toml +0 -2
  53. package/.devalang +0 -9
  54. package/.github/workflows/ci.yml +0 -103
  55. package/Cargo.toml +0 -84
  56. package/docs/CHANGELOG.md +0 -622
  57. package/docs/CONTRIBUTING.md +0 -101
  58. package/docs/ROADMAP.md +0 -38
  59. package/docs/TODO.md +0 -71
  60. package/examples/automation.deva +0 -42
  61. package/examples/bank.deva +0 -7
  62. package/examples/bus.deva +0 -10
  63. package/examples/chain.deva +0 -19
  64. package/examples/condition.deva +0 -20
  65. package/examples/duration.deva +0 -9
  66. package/examples/effect.deva +0 -2
  67. package/examples/events.deva +0 -12
  68. package/examples/filter.deva +0 -11
  69. package/examples/function.deva +0 -15
  70. package/examples/group.deva +0 -12
  71. package/examples/index.deva +0 -63
  72. package/examples/lfo.deva +0 -9
  73. package/examples/loop.deva +0 -10
  74. package/examples/pattern.deva +0 -8
  75. package/examples/plugin.deva +0 -16
  76. package/examples/routing.deva +0 -23
  77. package/examples/samples/hat-808.wav +0 -0
  78. package/examples/samples/kick-808.wav +0 -0
  79. package/examples/synth.deva +0 -24
  80. package/examples/synth_types.deva +0 -17
  81. package/examples/variables.deva +0 -9
  82. package/out-tsc/bin/project-version.json +0 -6
  83. package/out-tsc/core/functions/index.d.ts +0 -42
  84. package/out-tsc/core/functions/index.js +0 -87
  85. package/out-tsc/core/index.d.ts +0 -6
  86. package/out-tsc/core/types/index.d.ts +0 -4
  87. package/out-tsc/core/types/index.js +0 -20
  88. package/out-tsc/core/types/plugin.d.ts +0 -18
  89. package/out-tsc/core/types/plugin.js +0 -2
  90. package/out-tsc/core/types/result.d.ts +0 -27
  91. package/out-tsc/core/types/result.js +0 -2
  92. package/out-tsc/core/types/statement.d.ts +0 -106
  93. package/out-tsc/core/types/statement.js +0 -2
  94. package/out-tsc/core/types/value.d.ts +0 -43
  95. package/out-tsc/pkg/devalang_core.d.ts +0 -15
  96. package/out-tsc/pkg/devalang_core.js +0 -65
  97. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +0 -34
  98. package/out-tsc/scripts/version/copy-to-binary.d.ts +0 -1
  99. package/out-tsc/scripts/version/copy-to-binary.js +0 -79
  100. package/project-version.json +0 -6
  101. package/rust/bindings/Cargo.toml +0 -9
  102. package/rust/bindings/src/lib.rs +0 -86
  103. package/rust/cli/addon/commands.rs +0 -35
  104. package/rust/cli/addon/download.rs +0 -234
  105. package/rust/cli/addon/install.rs +0 -33
  106. package/rust/cli/addon/list.rs +0 -224
  107. package/rust/cli/addon/metadata.rs +0 -124
  108. package/rust/cli/addon/mod.rs +0 -8
  109. package/rust/cli/addon/remove.rs +0 -271
  110. package/rust/cli/addon/update.rs +0 -305
  111. package/rust/cli/addon/utils.rs +0 -109
  112. package/rust/cli/build/commands.rs +0 -153
  113. package/rust/cli/build/mod.rs +0 -2
  114. package/rust/cli/build/process.rs +0 -165
  115. package/rust/cli/check/mod.rs +0 -208
  116. package/rust/cli/discover/commands.rs +0 -275
  117. package/rust/cli/discover/config.rs +0 -109
  118. package/rust/cli/discover/fs.rs +0 -19
  119. package/rust/cli/discover/install.rs +0 -214
  120. package/rust/cli/discover/metadata.rs +0 -48
  121. package/rust/cli/discover/mod.rs +0 -5
  122. package/rust/cli/init/commands.rs +0 -88
  123. package/rust/cli/init/mod.rs +0 -1
  124. package/rust/cli/login/commands.rs +0 -124
  125. package/rust/cli/login/mod.rs +0 -1
  126. package/rust/cli/me/commands.rs +0 -52
  127. package/rust/cli/me/mod.rs +0 -1
  128. package/rust/cli/mod.rs +0 -12
  129. package/rust/cli/parser.rs +0 -320
  130. package/rust/cli/play/commands.rs +0 -375
  131. package/rust/cli/play/io.rs +0 -17
  132. package/rust/cli/play/mod.rs +0 -5
  133. package/rust/cli/play/process.rs +0 -159
  134. package/rust/cli/play/realtime.rs +0 -91
  135. package/rust/cli/play/utils.rs +0 -23
  136. package/rust/cli/telemetry/commands.rs +0 -22
  137. package/rust/cli/telemetry/event_creator.rs +0 -80
  138. package/rust/cli/telemetry/mod.rs +0 -3
  139. package/rust/cli/telemetry/send.rs +0 -51
  140. package/rust/cli/template/commands.rs +0 -69
  141. package/rust/cli/template/mod.rs +0 -1
  142. package/rust/cli/update/commands.rs +0 -6
  143. package/rust/cli/update/mod.rs +0 -1
  144. package/rust/config/driver.rs +0 -112
  145. package/rust/config/mod.rs +0 -3
  146. package/rust/config/ops.rs +0 -26
  147. package/rust/config/settings.rs +0 -101
  148. package/rust/core/audio/engine/driver.rs +0 -237
  149. package/rust/core/audio/engine/export.rs +0 -169
  150. package/rust/core/audio/engine/helpers.rs +0 -178
  151. package/rust/core/audio/engine/mod.rs +0 -56
  152. package/rust/core/audio/engine/notes/dsp.rs +0 -88
  153. package/rust/core/audio/engine/notes/mod.rs +0 -53
  154. package/rust/core/audio/engine/notes/params.rs +0 -294
  155. package/rust/core/audio/engine/sample/insert.rs +0 -300
  156. package/rust/core/audio/engine/sample/mod.rs +0 -40
  157. package/rust/core/audio/engine/sample/padding.rs +0 -170
  158. package/rust/core/audio/evaluator/condition.rs +0 -61
  159. package/rust/core/audio/evaluator/mod.rs +0 -9
  160. package/rust/core/audio/evaluator/numeric.rs +0 -152
  161. package/rust/core/audio/evaluator/rhs.rs +0 -16
  162. package/rust/core/audio/evaluator/string_expr.rs +0 -94
  163. package/rust/core/audio/interpreter/driver.rs +0 -574
  164. package/rust/core/audio/interpreter/mod.rs +0 -2
  165. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +0 -179
  166. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +0 -398
  167. package/rust/core/audio/interpreter/statements/arrow_call/methods/effects.rs +0 -323
  168. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +0 -3
  169. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +0 -371
  170. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +0 -3
  171. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +0 -192
  172. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +0 -24
  173. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +0 -116
  174. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +0 -97
  175. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +0 -100
  176. package/rust/core/audio/interpreter/statements/automate.rs +0 -16
  177. package/rust/core/audio/interpreter/statements/call.rs +0 -325
  178. package/rust/core/audio/interpreter/statements/condition.rs +0 -72
  179. package/rust/core/audio/interpreter/statements/function.rs +0 -24
  180. package/rust/core/audio/interpreter/statements/let_.rs +0 -36
  181. package/rust/core/audio/interpreter/statements/load.rs +0 -17
  182. package/rust/core/audio/interpreter/statements/loop_.rs +0 -115
  183. package/rust/core/audio/interpreter/statements/mod.rs +0 -12
  184. package/rust/core/audio/interpreter/statements/sleep.rs +0 -28
  185. package/rust/core/audio/interpreter/statements/spawn.rs +0 -302
  186. package/rust/core/audio/interpreter/statements/tempo.rs +0 -40
  187. package/rust/core/audio/interpreter/statements/trigger.rs +0 -242
  188. package/rust/core/audio/loader/mod.rs +0 -1
  189. package/rust/core/audio/loader/trigger.rs +0 -98
  190. package/rust/core/audio/mod.rs +0 -6
  191. package/rust/core/audio/player.rs +0 -70
  192. package/rust/core/audio/special/easing.rs +0 -189
  193. package/rust/core/audio/special/env.rs +0 -45
  194. package/rust/core/audio/special/math.rs +0 -134
  195. package/rust/core/audio/special/mod.rs +0 -9
  196. package/rust/core/audio/special/modulator.rs +0 -143
  197. package/rust/core/builder/mod.rs +0 -129
  198. package/rust/core/debugger/lexer.rs +0 -27
  199. package/rust/core/debugger/logs.rs +0 -52
  200. package/rust/core/debugger/mod.rs +0 -30
  201. package/rust/core/debugger/preprocessor.rs +0 -27
  202. package/rust/core/debugger/store.rs +0 -38
  203. package/rust/core/error/mod.rs +0 -269
  204. package/rust/core/lexer/driver.rs +0 -59
  205. package/rust/core/lexer/handler/arrow.rs +0 -82
  206. package/rust/core/lexer/handler/at.rs +0 -21
  207. package/rust/core/lexer/handler/brace.rs +0 -41
  208. package/rust/core/lexer/handler/colon.rs +0 -21
  209. package/rust/core/lexer/handler/comment.rs +0 -30
  210. package/rust/core/lexer/handler/dot.rs +0 -21
  211. package/rust/core/lexer/handler/driver.rs +0 -337
  212. package/rust/core/lexer/handler/identifier.rs +0 -47
  213. package/rust/core/lexer/handler/indent.rs +0 -66
  214. package/rust/core/lexer/handler/mod.rs +0 -15
  215. package/rust/core/lexer/handler/newline.rs +0 -23
  216. package/rust/core/lexer/handler/number.rs +0 -31
  217. package/rust/core/lexer/handler/operator.rs +0 -46
  218. package/rust/core/lexer/handler/parenthesis.rs +0 -41
  219. package/rust/core/lexer/handler/slash.rs +0 -21
  220. package/rust/core/lexer/handler/string.rs +0 -63
  221. package/rust/core/lexer/mod.rs +0 -3
  222. package/rust/core/lexer/token.rs +0 -91
  223. package/rust/core/mod.rs +0 -9
  224. package/rust/core/parser/driver/block.rs +0 -111
  225. package/rust/core/parser/driver/cursor.rs +0 -82
  226. package/rust/core/parser/driver/driver_impl.rs +0 -159
  227. package/rust/core/parser/driver/mod.rs +0 -6
  228. package/rust/core/parser/driver/parse_array.rs +0 -120
  229. package/rust/core/parser/driver/parse_map.rs +0 -247
  230. package/rust/core/parser/driver/parser.rs +0 -160
  231. package/rust/core/parser/handler/arrow_call.rs +0 -328
  232. package/rust/core/parser/handler/at.rs +0 -279
  233. package/rust/core/parser/handler/bank.rs +0 -104
  234. package/rust/core/parser/handler/condition.rs +0 -83
  235. package/rust/core/parser/handler/dot.rs +0 -148
  236. package/rust/core/parser/handler/identifier/automate.rs +0 -254
  237. package/rust/core/parser/handler/identifier/call.rs +0 -91
  238. package/rust/core/parser/handler/identifier/emit.rs +0 -70
  239. package/rust/core/parser/handler/identifier/function.rs +0 -113
  240. package/rust/core/parser/handler/identifier/group.rs +0 -89
  241. package/rust/core/parser/handler/identifier/let_.rs +0 -173
  242. package/rust/core/parser/handler/identifier/mod.rs +0 -55
  243. package/rust/core/parser/handler/identifier/on.rs +0 -107
  244. package/rust/core/parser/handler/identifier/print.rs +0 -49
  245. package/rust/core/parser/handler/identifier/sleep.rs +0 -96
  246. package/rust/core/parser/handler/identifier/spawn.rs +0 -91
  247. package/rust/core/parser/handler/identifier/synth.rs +0 -171
  248. package/rust/core/parser/handler/loop_.rs +0 -194
  249. package/rust/core/parser/handler/mod.rs +0 -9
  250. package/rust/core/parser/handler/pattern.rs +0 -97
  251. package/rust/core/parser/handler/tempo.rs +0 -105
  252. package/rust/core/parser/mod.rs +0 -3
  253. package/rust/core/parser/statement.rs +0 -10
  254. package/rust/core/plugin/loader.rs +0 -137
  255. package/rust/core/plugin/mod.rs +0 -2
  256. package/rust/core/plugin/runner/mod.rs +0 -11
  257. package/rust/core/plugin/runner/non_wasm.rs +0 -481
  258. package/rust/core/plugin/runner/wasm32.rs +0 -44
  259. package/rust/core/preprocessor/loader/inject.rs +0 -313
  260. package/rust/core/preprocessor/loader/loader_helpers.rs +0 -110
  261. package/rust/core/preprocessor/loader/mod.rs +0 -235
  262. package/rust/core/preprocessor/mod.rs +0 -4
  263. package/rust/core/preprocessor/module.rs +0 -55
  264. package/rust/core/preprocessor/processor/handlers.rs +0 -107
  265. package/rust/core/preprocessor/processor/mod.rs +0 -1
  266. package/rust/core/preprocessor/resolver/bank.rs +0 -49
  267. package/rust/core/preprocessor/resolver/call.rs +0 -124
  268. package/rust/core/preprocessor/resolver/condition.rs +0 -95
  269. package/rust/core/preprocessor/resolver/driver.rs +0 -324
  270. package/rust/core/preprocessor/resolver/function.rs +0 -69
  271. package/rust/core/preprocessor/resolver/group.rs +0 -122
  272. package/rust/core/preprocessor/resolver/let_.rs +0 -32
  273. package/rust/core/preprocessor/resolver/loop_.rs +0 -318
  274. package/rust/core/preprocessor/resolver/mod.rs +0 -16
  275. package/rust/core/preprocessor/resolver/pattern.rs +0 -95
  276. package/rust/core/preprocessor/resolver/spawn.rs +0 -99
  277. package/rust/core/preprocessor/resolver/synth.rs +0 -54
  278. package/rust/core/preprocessor/resolver/tempo.rs +0 -48
  279. package/rust/core/preprocessor/resolver/trigger.rs +0 -116
  280. package/rust/core/preprocessor/resolver/value.rs +0 -176
  281. package/rust/core/store/global.rs +0 -57
  282. package/rust/core/store/mod.rs +0 -1
  283. package/rust/lib.rs +0 -323
  284. package/rust/macros/Cargo.toml +0 -14
  285. package/rust/macros/src/lib.rs +0 -52
  286. package/rust/main.rs +0 -557
  287. package/rust/types/Cargo.toml +0 -11
  288. package/rust/types/src/addons.rs +0 -57
  289. package/rust/types/src/ast.rs +0 -202
  290. package/rust/types/src/config.rs +0 -82
  291. package/rust/types/src/lib.rs +0 -15
  292. package/rust/types/src/plugin.rs +0 -20
  293. package/rust/types/src/store.rs +0 -139
  294. package/rust/types/src/telemetry.rs +0 -85
  295. package/rust/utils/Cargo.toml +0 -29
  296. package/rust/utils/src/error.rs +0 -186
  297. package/rust/utils/src/file.rs +0 -477
  298. package/rust/utils/src/first_usage.rs +0 -97
  299. package/rust/utils/src/lib.rs +0 -9
  300. package/rust/utils/src/logger.rs +0 -200
  301. package/rust/utils/src/path.rs +0 -158
  302. package/rust/utils/src/signature.rs +0 -41
  303. package/rust/utils/src/spinner.rs +0 -20
  304. package/rust/utils/src/version.rs +0 -58
  305. package/rust/utils/src/watcher.rs +0 -46
  306. package/rust/web/api.rs +0 -5
  307. package/rust/web/auth.rs +0 -5
  308. package/rust/web/cdn.rs +0 -34
  309. package/rust/web/forge.rs +0 -5
  310. package/rust/web/mod.rs +0 -5
  311. package/rust/web/sso.rs +0 -5
  312. package/templates/minimal/.devalang +0 -5
  313. package/templates/minimal/README.md +0 -218
  314. package/templates/minimal/src/index.deva +0 -2
  315. package/templates/welcome/.devalang +0 -5
  316. package/templates/welcome/README.md +0 -218
  317. package/templates/welcome/samples/kick-808.wav +0 -0
  318. package/templates/welcome/src/index.deva +0 -61
  319. package/templates/welcome/src/variables.deva +0 -3
  320. package/tests/integration.rs +0 -21
  321. package/tests/rust/cli_check_build.rs +0 -21
  322. package/tests/rust/cli_help.rs +0 -12
  323. package/tests/rust/cli_template_list.rs +0 -10
  324. package/tests/rust/cli_version.rs +0 -11
  325. package/tests/typescript/index.spec.ts +0 -136
  326. package/tests/typescript/playhead.spec.ts +0 -36
  327. package/tests/typescript/render_e2e.spec.ts +0 -77
  328. package/tsconfig.json +0 -115
  329. package/typescript/bin/index.ts +0 -28
  330. package/typescript/core/functions/index.ts +0 -94
  331. package/typescript/core/index.ts +0 -6
  332. package/typescript/core/types/index.ts +0 -4
  333. package/typescript/core/types/plugin.ts +0 -19
  334. package/typescript/core/types/result.ts +0 -29
  335. package/typescript/core/types/statement.ts +0 -47
  336. package/typescript/core/types/value.ts +0 -29
  337. package/typescript/index.ts +0 -8
  338. package/typescript/pkg/devalang_core.d.ts +0 -4
  339. package/typescript/pkg/devalang_core.ts +0 -65
  340. package/typescript/scripts/copy-wasm-dts.ts +0 -41
  341. package/typescript/scripts/postinstall.ts +0 -85
  342. package/typescript/scripts/version/bump.ts +0 -44
  343. package/typescript/scripts/version/copy-to-binary.ts +0 -82
  344. package/typescript/scripts/version/fetch.ts +0 -18
  345. package/typescript/scripts/version/index.ts +0 -25
  346. package/typescript/scripts/version/sync.ts +0 -24
@@ -1,318 +0,0 @@
1
- use std::collections::HashMap;
2
-
3
- use crate::core::{
4
- parser::statement::{Statement, StatementKind},
5
- preprocessor::{
6
- module::Module,
7
- resolver::{driver::resolve_statement, value::resolve_value},
8
- },
9
- store::global::GlobalStore,
10
- };
11
- use devalang_types::Value;
12
- use devalang_utils::logger::Logger;
13
-
14
- pub fn resolve_loop(
15
- stmt: &Statement,
16
- module: &Module,
17
- path: &str,
18
- global_store: &mut GlobalStore,
19
- ) -> Statement {
20
- let logger = Logger::new();
21
-
22
- let resolved_value = resolve_value(&stmt.value, module, global_store);
23
-
24
- let Value::Map(value_map) = &resolved_value else {
25
- return error_stmt(&logger, module, stmt, "Expected a map for loop value");
26
- };
27
-
28
- let mut resolved_map: HashMap<String, Value> = HashMap::new();
29
- for (key, val) in value_map {
30
- resolved_map.insert(key.clone(), resolve_value(val, module, global_store));
31
- }
32
-
33
- // Foreach form takes precedence if present
34
- if let (Some(Value::Identifier(var_name)), Some(array_val)) =
35
- (resolved_map.get("foreach"), resolved_map.get("array"))
36
- {
37
- // Normalize array_val into an iterable Array
38
- let resolved_array = match array_val {
39
- Value::Array(items) => Value::Array(
40
- items
41
- .iter()
42
- .map(|v| resolve_value(v, module, global_store))
43
- .collect(),
44
- ),
45
- Value::Number(n) => {
46
- // Iterate 0..n-1
47
- let count = (*n).max(0.0) as usize;
48
- let mut items = Vec::with_capacity(count);
49
- for i in 0..count {
50
- items.push(Value::Number(i as f32));
51
- }
52
- Value::Array(items)
53
- }
54
- Value::String(s) => {
55
- // Try to parse a simple comma-separated list: "a,b,c" -> ["a","b","c"]
56
- // If numeric string: iterate 0..n-1
57
- if let Ok(n) = s.parse::<f32>() {
58
- let count = n.max(0.0) as usize;
59
- let mut items = Vec::with_capacity(count);
60
- for i in 0..count {
61
- items.push(Value::Number(i as f32));
62
- }
63
- Value::Array(items)
64
- } else if s.contains(',') {
65
- let parts: Vec<Value> = s
66
- .split(',')
67
- .map(|p| Value::String(p.trim().to_string()))
68
- .collect();
69
- Value::Array(parts)
70
- } else {
71
- // Fallback: iterate characters
72
- let parts: Vec<Value> =
73
- s.chars().map(|c| Value::String(c.to_string())).collect();
74
- Value::Array(parts)
75
- }
76
- }
77
- Value::Identifier(name) => {
78
- // Resolve identifier from module variables (already resolved map above)
79
- let v = if let Some(v) = module.variable_table.get(name) {
80
- v.clone()
81
- } else {
82
- Value::Null
83
- };
84
- match v {
85
- Value::Array(items) => Value::Array(
86
- items
87
- .iter()
88
- .map(|v| resolve_value(v, module, global_store))
89
- .collect(),
90
- ),
91
- Value::Number(n) => {
92
- let count = n.max(0.0) as usize;
93
- let mut items = Vec::with_capacity(count);
94
- for i in 0..count {
95
- items.push(Value::Number(i as f32));
96
- }
97
- Value::Array(items)
98
- }
99
- Value::String(s) => {
100
- if let Ok(n) = s.parse::<f32>() {
101
- let count = n.max(0.0) as usize;
102
- let mut items = Vec::with_capacity(count);
103
- for i in 0..count {
104
- items.push(Value::Number(i as f32));
105
- }
106
- Value::Array(items)
107
- } else if s.contains(',') {
108
- let parts: Vec<Value> = s
109
- .split(',')
110
- .map(|p| Value::String(p.trim().to_string()))
111
- .collect();
112
- Value::Array(parts)
113
- } else {
114
- let parts: Vec<Value> =
115
- s.chars().map(|c| Value::String(c.to_string())).collect();
116
- Value::Array(parts)
117
- }
118
- }
119
- other => {
120
- error_value(
121
- &logger,
122
- module,
123
- stmt,
124
- &format!(
125
- "Foreach identifier '{}' resolves to unsupported value: {:?}",
126
- name, other
127
- ),
128
- );
129
- Value::Array(vec![])
130
- }
131
- }
132
- }
133
- other => {
134
- // Resolve and normalize if possible
135
- let v = resolve_value(other, module, global_store);
136
- match v {
137
- Value::Array(items) => Value::Array(items),
138
- Value::Number(n) => {
139
- let count = n.max(0.0) as usize;
140
- let mut items = Vec::with_capacity(count);
141
- for i in 0..count {
142
- items.push(Value::Number(i as f32));
143
- }
144
- Value::Array(items)
145
- }
146
- Value::String(s) => {
147
- if let Ok(n) = s.parse::<f32>() {
148
- let count = n.max(0.0) as usize;
149
- let mut items = Vec::with_capacity(count);
150
- for i in 0..count {
151
- items.push(Value::Number(i as f32));
152
- }
153
- Value::Array(items)
154
- } else if s.contains(',') {
155
- let parts: Vec<Value> = s
156
- .split(',')
157
- .map(|p| Value::String(p.trim().to_string()))
158
- .collect();
159
- Value::Array(parts)
160
- } else {
161
- let parts: Vec<Value> =
162
- s.chars().map(|c| Value::String(c.to_string())).collect();
163
- Value::Array(parts)
164
- }
165
- }
166
- other => {
167
- error_value(
168
- &logger,
169
- module,
170
- stmt,
171
- &format!("Unsupported foreach array value: {:?}", other),
172
- );
173
- Value::Array(vec![])
174
- }
175
- }
176
- }
177
- };
178
-
179
- let body_value = match resolved_map.get("body") {
180
- Some(Value::Block(stmts)) => {
181
- let resolved = stmts
182
- .iter()
183
- .map(|s| resolve_statement(s, module, path, global_store))
184
- .collect();
185
- Value::Block(resolved)
186
- }
187
- _ => {
188
- error_value(&logger, module, stmt, "Invalid or missing loop body");
189
- Value::Block(vec![])
190
- }
191
- };
192
-
193
- let mut final_map = HashMap::new();
194
- final_map.insert("foreach".to_string(), Value::Identifier(var_name.clone()));
195
- final_map.insert("array".to_string(), resolved_array);
196
- final_map.insert("body".to_string(), body_value);
197
-
198
- return Statement {
199
- kind: StatementKind::Loop,
200
- value: Value::Map(final_map),
201
- ..stmt.clone()
202
- };
203
- }
204
-
205
- let iterator_value = match resolved_map.get("iterator") {
206
- Some(Value::Number(n)) => Value::Number(*n),
207
- Some(Value::String(s)) => {
208
- if let Ok(n) = s.parse::<f32>() {
209
- Value::Number(n)
210
- } else {
211
- error_value(
212
- &logger,
213
- module,
214
- stmt,
215
- &format!("Loop iterator string not numeric: '{}'", s),
216
- );
217
- Value::Number(1.0)
218
- }
219
- }
220
- Some(Value::Identifier(name)) => {
221
- // Try resolving from module vars (may be number or numeric string)
222
- if let Some(v) = module.variable_table.get(name) {
223
- match v {
224
- Value::Number(n) => Value::Number(*n),
225
- Value::String(s) => {
226
- if let Ok(n) = s.parse::<f32>() {
227
- Value::Number(n)
228
- } else {
229
- error_value(
230
- &logger,
231
- module,
232
- stmt,
233
- &format!(
234
- "Loop iterator '{}' resolves to non-numeric string: '{}'",
235
- name, s
236
- ),
237
- );
238
- Value::Number(1.0)
239
- }
240
- }
241
- other => {
242
- error_value(
243
- &logger,
244
- module,
245
- stmt,
246
- &format!(
247
- "Loop iterator '{}' resolves to non-number: {:?}",
248
- name, other
249
- ),
250
- );
251
- Value::Number(1.0)
252
- }
253
- }
254
- } else {
255
- error_value(
256
- &logger,
257
- module,
258
- stmt,
259
- &format!("Loop iterator identifier '{}' not found", name),
260
- );
261
- Value::Number(1.0)
262
- }
263
- }
264
- Some(other) => {
265
- error_value(
266
- &logger,
267
- module,
268
- stmt,
269
- &format!("Loop iterator must be a number, found: {:?}", other),
270
- );
271
- Value::Number(1.0)
272
- }
273
- None => {
274
- error_value(&logger, module, stmt, "Missing 'iterator' in loop");
275
- Value::Number(1.0)
276
- }
277
- };
278
-
279
- let body_value = match resolved_map.get("body") {
280
- Some(Value::Block(stmts)) => {
281
- let resolved = stmts
282
- .iter()
283
- .map(|s| resolve_statement(s, module, path, global_store))
284
- .collect();
285
- Value::Block(resolved)
286
- }
287
- _ => {
288
- error_value(&logger, module, stmt, "Invalid or missing loop body");
289
- Value::Block(vec![])
290
- }
291
- };
292
-
293
- let mut final_map = HashMap::new();
294
- final_map.insert("iterator".to_string(), iterator_value);
295
- final_map.insert("body".to_string(), body_value);
296
-
297
- Statement {
298
- kind: StatementKind::Loop,
299
- value: Value::Map(final_map),
300
- ..stmt.clone()
301
- }
302
- }
303
-
304
- fn error_value(logger: &Logger, module: &Module, stmt: &Statement, msg: &str) {
305
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
306
- logger.log_error_with_stacktrace(msg, &stacktrace);
307
- }
308
-
309
- fn error_stmt(logger: &Logger, module: &Module, stmt: &Statement, msg: &str) -> Statement {
310
- error_value(logger, module, stmt, msg);
311
- Statement {
312
- kind: StatementKind::Error {
313
- message: msg.to_string(),
314
- },
315
- value: Value::Null,
316
- ..stmt.clone()
317
- }
318
- }
@@ -1,16 +0,0 @@
1
- pub mod driver;
2
-
3
- pub mod value;
4
-
5
- pub mod bank;
6
- pub mod call;
7
- pub mod condition;
8
- pub mod function;
9
- pub mod group;
10
- pub mod let_;
11
- pub mod loop_;
12
- pub mod pattern;
13
- pub mod spawn;
14
- pub mod synth;
15
- pub mod tempo;
16
- pub mod trigger;
@@ -1,95 +0,0 @@
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(
22
- &format!("Pattern identifier '{}' already exists", name),
23
- path,
24
- );
25
- return Statement {
26
- kind: StatementKind::Error {
27
- message: format!("Pattern '{}' already exists", name),
28
- },
29
- ..stmt.clone()
30
- };
31
- }
32
-
33
- // Resolve potential target and pattern string value
34
- let resolved_value = resolve_value(&stmt.value, module, global_store);
35
-
36
- // Build a map to store the pattern definition
37
- let mut map = std::collections::HashMap::new();
38
- map.insert("identifier".to_string(), Value::String(name.clone()));
39
- if let Some(t) = target {
40
- map.insert("target".to_string(), Value::String(t.clone()));
41
- }
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
- }
56
-
57
- let resolved_stmt = Statement {
58
- kind: StatementKind::Pattern {
59
- name: name.clone(),
60
- target: target.clone(),
61
- },
62
- value: resolved_value,
63
- ..stmt.clone()
64
- };
65
-
66
- // Store into global variables as a Statement
67
- global_store.variables.variables.insert(
68
- name.clone(),
69
- Value::Statement(Box::new(resolved_stmt.clone())),
70
- );
71
-
72
- return resolved_stmt;
73
- }
74
-
75
- logger.log_message(
76
- LogLevel::Warning,
77
- "resolve_pattern called on non-pattern statement",
78
- );
79
- stmt.clone()
80
- }
81
-
82
- fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore) -> Value {
83
- // reuse driver::resolve_value logic; simple local resolution for pattern value
84
- match value {
85
- Value::String(s) => Value::String(s.clone()),
86
- Value::Map(m) => {
87
- let mut resolved = std::collections::HashMap::new();
88
- for (k, v) in m {
89
- resolved.insert(k.clone(), resolve_value(v, module, global_store));
90
- }
91
- Value::Map(resolved)
92
- }
93
- other => other.clone(),
94
- }
95
- }
@@ -1,99 +0,0 @@
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_spawn(
10
- stmt: &Statement,
11
- name: String,
12
- args: Vec<Value>,
13
- module: &Module,
14
- _path: &str,
15
- global_store: &mut GlobalStore,
16
- ) -> Statement {
17
- let logger = Logger::new();
18
-
19
- // If it's a function
20
- if let Some(func) = global_store.functions.functions.get(&name) {
21
- let mut resolved_map = std::collections::HashMap::new();
22
- resolved_map.insert("name".to_string(), Value::String(name.clone()));
23
- resolved_map.insert("args".to_string(), Value::Array(args.clone()));
24
- resolved_map.insert("body".to_string(), Value::Block(func.body.clone()));
25
-
26
- return Statement {
27
- kind: StatementKind::Spawn { name, args },
28
- value: Value::Map(resolved_map),
29
- ..stmt.clone()
30
- };
31
- }
32
-
33
- // If it's a group stored in variables
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()));
42
-
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());
66
- }
67
- }
68
- _ => {}
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
- };
77
- }
78
- }
79
-
80
- // Otherwise, log an error
81
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
82
- logger.log_message(
83
- LogLevel::Error,
84
- &format!(
85
- "Function or group '{}' not found for spawn\n → at {stacktrace}",
86
- name
87
- ),
88
- );
89
-
90
- Statement {
91
- kind: StatementKind::Error {
92
- message: format!("Function or group '{}' not found for spawn", name),
93
- },
94
- value: Value::Null,
95
- ..stmt.clone()
96
- }
97
- }
98
-
99
- // (removed unused helpers get_group_body, error_stmt)
@@ -1,54 +0,0 @@
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_synth(
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(synth_map) = &stmt.value else {
18
- return type_error(
19
- &logger,
20
- module,
21
- stmt,
22
- "Expected a map in synth statement".to_string(),
23
- );
24
- };
25
-
26
- let mut resolved_map = synth_map.clone();
27
-
28
- if let Some(Value::Block(body)) = synth_map.get("body") {
29
- let resolved_body = body
30
- .iter()
31
- .map(|s| resolve_statement(s, module, path, global_store))
32
- .collect::<Vec<_>>();
33
- resolved_map.insert("body".to_string(), Value::Block(resolved_body));
34
- } else {
35
- logger.log_message(LogLevel::Warning, "synth without a body");
36
- }
37
-
38
- Statement {
39
- kind: StatementKind::Synth,
40
- value: Value::Map(resolved_map),
41
- ..stmt.clone()
42
- }
43
- }
44
-
45
- fn type_error(logger: &Logger, module: &Module, stmt: &Statement, message: String) -> Statement {
46
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
47
- logger.log_error_with_stacktrace(&message, &stacktrace);
48
-
49
- Statement {
50
- kind: StatementKind::Error { message },
51
- value: Value::Null,
52
- ..stmt.clone()
53
- }
54
- }
@@ -1,48 +0,0 @@
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::Logger;
8
-
9
- pub fn resolve_tempo(
10
- stmt: &Statement,
11
- module: &Module,
12
- _path: &str,
13
- _global_store: &GlobalStore,
14
- ) -> Statement {
15
- let mut new_stmt = stmt.clone();
16
- let logger = Logger::new();
17
-
18
- match &stmt.value {
19
- Value::Identifier(ident) => {
20
- if let Some(val) = module.variable_table.get(ident) {
21
- new_stmt.value = val.clone();
22
- } else {
23
- let message = format!("Tempo identifier '{ident}' not found in variable table");
24
- logger.log_error_with_stacktrace(&message, &module.path);
25
- new_stmt.kind = StatementKind::Error { message };
26
- new_stmt.value = Value::Null;
27
- }
28
- }
29
-
30
- Value::Number(_) => {
31
- // Already resolved, no modification needed
32
- }
33
-
34
- other => {
35
- let message = format!(
36
- "Expected a number or identifier for tempo, found {:?}",
37
- other
38
- );
39
- logger.log_error_with_stacktrace(&message, &module.path);
40
- new_stmt.kind = StatementKind::Error {
41
- message: "Expected a number or identifier for tempo".to_string(),
42
- };
43
- new_stmt.value = Value::Null;
44
- }
45
- }
46
-
47
- new_stmt
48
- }