@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
package/rust/main.rs CHANGED
@@ -1,65 +1,388 @@
1
- #![cfg(feature = "cli")]
2
-
3
- pub mod core;
4
- pub mod cli;
5
- pub mod utils;
6
- pub mod config;
7
-
8
- use std::io;
9
- use cli::{ Cli };
10
- use clap::Parser;
11
- use crate::{
12
- cli::{
13
- build::handle_build_command,
14
- check::handle_check_command,
15
- init::handle_init_command,
16
- play::handle_play_command,
17
- template::{ handle_template_info_command, handle_template_list_command },
18
- Commands,
19
- TemplateCommand,
20
- },
21
- config::{ loader::load_config, Config },
22
- };
23
-
24
- fn main() -> io::Result<()> {
25
- let cli: Cli = Cli::parse();
26
- let mut config: Option<Config> = None;
27
-
28
- if !cli.no_config {
29
- config = load_config(None);
30
- } else {
31
- println!("No configuration file loaded. Running with arguments only.");
32
- }
33
-
34
- match cli.command {
35
- Commands::Init { name, template } => {
36
- handle_init_command(name, template);
37
- }
38
-
39
- Commands::Template { command } =>
40
- match command {
41
- TemplateCommand::List => {
42
- handle_template_list_command();
43
- }
44
- TemplateCommand::Info { name } => {
45
- handle_template_info_command(name);
46
- }
47
- }
48
-
49
- Commands::Check { entry, output, watch, compilation_mode, debug } => {
50
- handle_check_command(config, entry, output, watch);
51
- }
52
-
53
- Commands::Build { entry, output, watch, compilation_mode, debug, compress } => {
54
- handle_build_command(config, entry, output, watch);
55
- }
56
-
57
- Commands::Play { entry, output, watch, repeat } => {
58
- handle_play_command(config, entry, output, watch, repeat);
59
- }
60
-
61
- _ => {}
62
- }
63
-
64
- Ok(())
65
- }
1
+ #![cfg(feature = "cli")]
2
+
3
+ pub mod cli;
4
+ pub mod config;
5
+ pub mod core;
6
+ pub mod web;
7
+ pub use devalang_utils as utils;
8
+ use devalang_utils::path::ensure_deva_dir;
9
+
10
+ use crate::cli::telemetry::send::send_telemetry_event;
11
+ use crate::config::settings::ensure_user_config_file_exists;
12
+ use crate::config::settings::write_user_config_file;
13
+ use crate::{
14
+ cli::{
15
+ bank::{
16
+ handle_bank_available_command, handle_bank_info_command, handle_bank_list_command,
17
+ handle_remove_bank_command, handle_update_bank_command,
18
+ },
19
+ build::commands::handle_build_command,
20
+ check::handle_check_command,
21
+ discover::commands::handle_discover_command,
22
+ init::commands::handle_init_command,
23
+ install::commands::handle_install_command,
24
+ login::commands::handle_login_command,
25
+ parser::{BankCommand, Cli, Commands, InstallCommand, TelemetryCommand, TemplateCommand},
26
+ play::commands::handle_play_command,
27
+ telemetry::{
28
+ commands::{handle_telemetry_disable_command, handle_telemetry_enable_command},
29
+ event_creator::{TelemetryEventCreator, TelemetryEventExt},
30
+ },
31
+ template::commands::{handle_template_info_command, handle_template_list_command},
32
+ update::commands::handle_update_command,
33
+ },
34
+ config::driver::ProjectConfig,
35
+ utils::first_usage::check_is_first_usage,
36
+ };
37
+ use clap::CommandFactory;
38
+ use clap::FromArgMatches;
39
+ use devalang_types::{AddonType, TelemetryErrorLevel};
40
+ use std::io;
41
+
42
+ #[tokio::main]
43
+ async fn main() -> io::Result<()> {
44
+ let version = devalang_utils::version::get_version();
45
+ let signature = devalang_utils::signature::get_signature(&version);
46
+
47
+ let version_static: &'static str = Box::leak(format!("v{}", version).into_boxed_str());
48
+ let signature_static: &'static str = Box::leak(signature.into_boxed_str());
49
+
50
+ let mut cmd = Cli::command();
51
+ cmd = cmd.version(version_static).before_help(signature_static);
52
+
53
+ let raw_args: Vec<String> = std::env::args().collect();
54
+ if raw_args.iter().any(|a| (a == "--version" || a == "-V")) {
55
+ println!("{}", signature_static);
56
+ return Ok(());
57
+ }
58
+
59
+ let matches = cmd.get_matches();
60
+ let cli: Cli = Cli::from_arg_matches(&matches).expect("failed to parse cli args");
61
+ let mut config: Option<ProjectConfig> = None;
62
+
63
+ let telemetry_event_creator = TelemetryEventCreator::new();
64
+ let mut event = telemetry_event_creator.get_base_event();
65
+
66
+ let mut had_error: bool = false;
67
+ let mut last_error_message: Option<String> = None;
68
+ let mut exit_code: Option<i32> = None;
69
+
70
+ let _ = ensure_deva_dir();
71
+
72
+ if check_is_first_usage() == true {
73
+ write_user_config_file();
74
+ } else {
75
+ ensure_user_config_file_exists();
76
+ }
77
+
78
+ let duration = std::time::Instant::now();
79
+
80
+ if !cli.no_config {
81
+ config = config::ops::load_config(None);
82
+ } else {
83
+ println!("No configuration file loaded. Running with arguments only.");
84
+ }
85
+
86
+ match cli.command {
87
+ Commands::Init { name, template } => {
88
+ handle_init_command(name, template);
89
+ }
90
+
91
+ Commands::Template { command } => match command {
92
+ TemplateCommand::List => {
93
+ handle_template_list_command();
94
+ }
95
+ TemplateCommand::Info { name } => {
96
+ handle_template_info_command(name);
97
+ }
98
+ },
99
+
100
+ Commands::Check {
101
+ entry,
102
+ output,
103
+ watch,
104
+ debug,
105
+ } => {
106
+ if let Err(err) = handle_check_command(config, entry, output, watch, debug) {
107
+ let logger = devalang_utils::logger::Logger::new();
108
+ logger.log_message(
109
+ devalang_utils::logger::LogLevel::Error,
110
+ &format!("❌ Check failed: {}", err),
111
+ );
112
+ had_error = true;
113
+ last_error_message = Some(format!("check failed: {}", err));
114
+ exit_code = Some(1);
115
+ }
116
+ }
117
+
118
+ Commands::Build {
119
+ entry,
120
+ output,
121
+ watch,
122
+ debug,
123
+ compress,
124
+ output_format,
125
+ audio_format,
126
+ sample_rate,
127
+ } => {
128
+ if let Err(err) = handle_build_command(
129
+ config,
130
+ entry,
131
+ output,
132
+ output_format,
133
+ audio_format,
134
+ sample_rate,
135
+ watch,
136
+ debug,
137
+ compress,
138
+ ) {
139
+ let logger = devalang_utils::logger::Logger::new();
140
+ logger.log_message(
141
+ devalang_utils::logger::LogLevel::Error,
142
+ &format!("❌ Build failed: {}", err),
143
+ );
144
+ had_error = true;
145
+ last_error_message = Some(format!("build failed: {}", err));
146
+ exit_code = Some(1);
147
+ }
148
+ }
149
+
150
+ Commands::Play {
151
+ entry,
152
+ output,
153
+ sample_rate,
154
+ watch,
155
+ repeat,
156
+ debug,
157
+ audio_format,
158
+ } => {
159
+ if let Err(err) = handle_play_command(
160
+ config,
161
+ entry,
162
+ output,
163
+ audio_format,
164
+ sample_rate,
165
+ watch,
166
+ repeat,
167
+ debug,
168
+ ) {
169
+ let logger = devalang_utils::logger::Logger::new();
170
+ logger.log_message(
171
+ devalang_utils::logger::LogLevel::Error,
172
+ &format!("❌ Play failed: {}", err),
173
+ );
174
+ had_error = true;
175
+ last_error_message = Some(format!("play failed: {}", err));
176
+ exit_code = Some(1);
177
+ }
178
+ }
179
+
180
+ Commands::Install { command } => match command {
181
+ InstallCommand::Template { name } => {
182
+ if let Err(err) = handle_install_command(name, AddonType::Template).await {
183
+ let logger = devalang_utils::logger::Logger::new();
184
+ logger.log_message(
185
+ devalang_utils::logger::LogLevel::Error,
186
+ &format!("❌ Failed to install template: {}", err),
187
+ );
188
+ had_error = true;
189
+ last_error_message = Some(format!("install template failed: {}", err));
190
+ exit_code = Some(1);
191
+ }
192
+ }
193
+ InstallCommand::Bank { name } => {
194
+ if let Err(err) = handle_install_command(name, AddonType::Bank).await {
195
+ let logger = devalang_utils::logger::Logger::new();
196
+ logger.log_message(
197
+ devalang_utils::logger::LogLevel::Error,
198
+ &format!("❌ Failed to install bank: {}", err),
199
+ );
200
+ had_error = true;
201
+ last_error_message = Some(format!("install bank failed: {}", err));
202
+ exit_code = Some(1);
203
+ }
204
+ }
205
+ InstallCommand::Plugin { name } => {
206
+ if let Err(err) = handle_install_command(name, AddonType::Plugin).await {
207
+ let logger = devalang_utils::logger::Logger::new();
208
+ logger.log_message(
209
+ devalang_utils::logger::LogLevel::Error,
210
+ &format!("❌ Failed to install plugin: {}", err),
211
+ );
212
+ had_error = true;
213
+ last_error_message = Some(format!("install plugin failed: {}", err));
214
+ exit_code = Some(1);
215
+ }
216
+ }
217
+ InstallCommand::Preset { name } => {
218
+ if let Err(err) = handle_install_command(name, AddonType::Preset).await {
219
+ let logger = devalang_utils::logger::Logger::new();
220
+ logger.log_message(
221
+ devalang_utils::logger::LogLevel::Error,
222
+ &format!("❌ Failed to install preset: {}", err),
223
+ );
224
+ had_error = true;
225
+ last_error_message = Some(format!("install preset failed: {}", err));
226
+ exit_code = Some(1);
227
+ }
228
+ }
229
+ },
230
+
231
+ Commands::Bank { command } => match command {
232
+ BankCommand::List => {
233
+ if let Err(err) = handle_bank_list_command().await {
234
+ let logger = devalang_utils::logger::Logger::new();
235
+ logger.log_message(
236
+ devalang_utils::logger::LogLevel::Error,
237
+ &format!("❌ Failed to list local banks: {}", err),
238
+ );
239
+ had_error = true;
240
+ last_error_message = Some(format!("bank list failed: {}", err));
241
+ exit_code = Some(1);
242
+ }
243
+ }
244
+
245
+ BankCommand::Available => {
246
+ if let Err(err) = handle_bank_available_command().await {
247
+ let logger = devalang_utils::logger::Logger::new();
248
+ logger.log_message(
249
+ devalang_utils::logger::LogLevel::Error,
250
+ &format!("❌ Failed to list available banks: {}", err),
251
+ );
252
+ had_error = true;
253
+ last_error_message = Some(format!("bank available failed: {}", err));
254
+ exit_code = Some(1);
255
+ }
256
+ }
257
+
258
+ BankCommand::Info { name } => {
259
+ if let Err(err) = handle_bank_info_command(name).await {
260
+ let logger = devalang_utils::logger::Logger::new();
261
+ logger.log_message(
262
+ devalang_utils::logger::LogLevel::Error,
263
+ &format!("❌ Failed to get bank info: {}", err),
264
+ );
265
+ had_error = true;
266
+ last_error_message = Some(format!("bank info failed: {}", err));
267
+ exit_code = Some(1);
268
+ }
269
+ }
270
+
271
+ BankCommand::Remove { name } => {
272
+ if let Err(err) = handle_remove_bank_command(name).await {
273
+ let logger = devalang_utils::logger::Logger::new();
274
+ logger.log_message(
275
+ devalang_utils::logger::LogLevel::Error,
276
+ &format!("❌ Failed to remove bank: {}", err),
277
+ );
278
+ had_error = true;
279
+ last_error_message = Some(format!("bank remove failed: {}", err));
280
+ exit_code = Some(1);
281
+ }
282
+ }
283
+
284
+ BankCommand::Update { name } => {
285
+ if let Err(err) = handle_update_bank_command(name).await {
286
+ let logger = devalang_utils::logger::Logger::new();
287
+ logger.log_message(
288
+ devalang_utils::logger::LogLevel::Error,
289
+ &format!("❌ Failed to update bank: {}", err),
290
+ );
291
+ had_error = true;
292
+ last_error_message = Some(format!("bank update failed: {}", err));
293
+ exit_code = Some(1);
294
+ }
295
+ }
296
+ },
297
+
298
+ Commands::Update { only } => {
299
+ if let Err(err) = handle_update_command(only).await {
300
+ let logger = devalang_utils::logger::Logger::new();
301
+ logger.log_message(
302
+ devalang_utils::logger::LogLevel::Error,
303
+ &format!("❌ Update failed: {}", err),
304
+ );
305
+ had_error = true;
306
+ last_error_message = Some(format!("update failed: {}", err));
307
+ exit_code = Some(1);
308
+ }
309
+ }
310
+
311
+ Commands::Telemetry { command } => match command {
312
+ TelemetryCommand::Enable { .. } => {
313
+ if let Err(err) = handle_telemetry_enable_command().await {
314
+ let logger = devalang_utils::logger::Logger::new();
315
+ logger.log_message(
316
+ devalang_utils::logger::LogLevel::Error,
317
+ &format!("❌ Failed to enable telemetry: {}", err),
318
+ );
319
+ had_error = true;
320
+ last_error_message = Some(format!("telemetry enable failed: {}", err));
321
+ exit_code = Some(1);
322
+ }
323
+ }
324
+ TelemetryCommand::Disable { .. } => {
325
+ if let Err(err) = handle_telemetry_disable_command().await {
326
+ let logger = devalang_utils::logger::Logger::new();
327
+ logger.log_message(
328
+ devalang_utils::logger::LogLevel::Error,
329
+ &format!("❌ Failed to disable telemetry: {}", err),
330
+ );
331
+ had_error = true;
332
+ last_error_message = Some(format!("telemetry disable failed: {}", err));
333
+ exit_code = Some(1);
334
+ }
335
+ }
336
+ },
337
+
338
+ Commands::Discover {} => {
339
+ if let Err(err) = handle_discover_command().await {
340
+ let logger = devalang_utils::logger::Logger::new();
341
+ logger.log_message(
342
+ devalang_utils::logger::LogLevel::Error,
343
+ &format!("❌ Failed to discover: {}", err),
344
+ );
345
+ had_error = true;
346
+ last_error_message = Some(format!("discover failed: {}", err));
347
+ exit_code = Some(1);
348
+ }
349
+ }
350
+
351
+ Commands::Login { .. } => {
352
+ if let Err(err) = handle_login_command().await {
353
+ let logger = devalang_utils::logger::Logger::new();
354
+ logger.log_message(
355
+ devalang_utils::logger::LogLevel::Error,
356
+ &format!("❌ Login failed: {}", err),
357
+ );
358
+ had_error = true;
359
+ last_error_message = Some(format!("login failed: {}", err));
360
+ exit_code = Some(1);
361
+ }
362
+ }
363
+
364
+ Commands::Logout { .. } => {
365
+ let logger = devalang_utils::logger::Logger::new();
366
+ logger.log_message(
367
+ devalang_utils::logger::LogLevel::Error,
368
+ "❌ Logout command is not implemented yet.",
369
+ );
370
+ had_error = true;
371
+ last_error_message = Some("logout not implemented".to_string());
372
+ exit_code = Some(1);
373
+ }
374
+ }
375
+
376
+ // SECTION Telemetry
377
+ event.set_timestamp(chrono::Utc::now().to_string());
378
+ event.set_duration(duration.elapsed().as_millis() as u64);
379
+ event.set_success(!had_error);
380
+
381
+ if had_error {
382
+ event.set_error(TelemetryErrorLevel::Critical, last_error_message, exit_code);
383
+ }
384
+
385
+ let _ = send_telemetry_event(&event).await;
386
+
387
+ Ok(())
388
+ }
@@ -0,0 +1,11 @@
1
+ [package]
2
+ name = "devalang_types"
3
+ version = "0.0.3"
4
+ description = "Types and traits for Devalang"
5
+ license = "MIT"
6
+ authors = ["Devaloop <contact@devaloop.com>"]
7
+ edition = "2024"
8
+
9
+ [dependencies]
10
+ serde = { version = "1.0", features = ["derive"] }
11
+ toml = "0.8"
@@ -0,0 +1,55 @@
1
+ use serde::Deserialize;
2
+
3
+ #[derive(Debug, Clone)]
4
+ pub struct DiscoveredAddon {
5
+ pub path: std::path::PathBuf,
6
+ pub name: String,
7
+ pub extension: String,
8
+ pub addon_type: String,
9
+ }
10
+
11
+ #[derive(Debug, Clone)]
12
+ pub struct AddonWithMetadata {
13
+ pub name: String,
14
+ pub path: String,
15
+ pub addon_type: String,
16
+ pub metadata: AddonMetadata,
17
+ }
18
+
19
+ #[derive(Debug, Clone)]
20
+ pub struct AddonMetadata {
21
+ pub name: String,
22
+ pub author: String,
23
+ pub version: String,
24
+ pub description: String,
25
+ pub access: String,
26
+ }
27
+
28
+ #[derive(Debug, Clone)]
29
+ pub enum AddonType {
30
+ Bank,
31
+ Plugin,
32
+ Preset,
33
+ Template,
34
+ }
35
+
36
+ #[derive(Debug, Deserialize)]
37
+ pub struct BankInfo {
38
+ pub name: String,
39
+ pub version: String,
40
+ pub description: String,
41
+ pub author: String,
42
+ }
43
+
44
+ #[derive(Debug, Deserialize)]
45
+ pub struct BankFile {
46
+ pub bank: BankInfo,
47
+ pub triggers: Option<Vec<BankTrigger>>,
48
+ pub audio_path: Option<String>,
49
+ }
50
+
51
+ #[derive(Debug, Deserialize)]
52
+ pub struct BankTrigger {
53
+ pub name: String,
54
+ pub path: String,
55
+ }