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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. package/.cargo/config.toml +2 -0
  2. package/.devalang +10 -10
  3. package/.github/workflows/ci.yml +0 -1
  4. package/Cargo.toml +18 -2
  5. package/README.md +82 -34
  6. package/docs/CHANGELOG.md +91 -0
  7. package/docs/ROADMAP.md +7 -4
  8. package/docs/TODO.md +1 -1
  9. package/examples/index.deva +55 -35
  10. package/examples/pattern.deva +5 -5
  11. package/out-tsc/bin/index.d.ts +2 -0
  12. package/out-tsc/core/functions/index.d.ts +37 -0
  13. package/out-tsc/core/functions/index.js +76 -0
  14. package/out-tsc/core/index.d.ts +6 -0
  15. package/out-tsc/core/index.js +22 -0
  16. package/out-tsc/core/types/index.d.ts +4 -0
  17. package/out-tsc/core/types/index.js +20 -0
  18. package/out-tsc/core/types/plugin.d.ts +18 -0
  19. package/out-tsc/core/types/plugin.js +2 -0
  20. package/out-tsc/core/types/result.d.ts +27 -0
  21. package/out-tsc/core/types/result.js +2 -0
  22. package/out-tsc/core/types/statement.d.ts +106 -0
  23. package/out-tsc/core/types/statement.js +2 -0
  24. package/out-tsc/core/types/value.d.ts +43 -0
  25. package/out-tsc/core/types/value.js +2 -0
  26. package/out-tsc/index.d.ts +7 -0
  27. package/out-tsc/index.js +41 -2
  28. package/out-tsc/pkg/devalang_core.d.ts +7 -0
  29. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +33 -0
  30. package/out-tsc/scripts/copy-wasm-dts.d.ts +1 -0
  31. package/out-tsc/scripts/copy-wasm-dts.js +73 -0
  32. package/out-tsc/scripts/postinstall.d.ts +1 -0
  33. package/out-tsc/scripts/postinstall.js +33 -23
  34. package/out-tsc/scripts/version/bump.d.ts +1 -0
  35. package/out-tsc/scripts/version/fetch.d.ts +1 -0
  36. package/out-tsc/scripts/version/index.d.ts +1 -0
  37. package/out-tsc/scripts/version/sync.d.ts +1 -0
  38. package/package.json +16 -4
  39. package/project-version.json +3 -3
  40. package/rust/cli/bank/api.rs +122 -0
  41. package/rust/cli/bank/commands.rs +275 -0
  42. package/rust/cli/bank/mod.rs +29 -0
  43. package/rust/cli/build/commands.rs +107 -0
  44. package/rust/cli/build/mod.rs +2 -0
  45. package/rust/cli/build/process.rs +146 -0
  46. package/rust/cli/{check.rs → check/mod.rs} +18 -31
  47. package/rust/cli/discover/commands.rs +253 -0
  48. package/rust/cli/discover/config.rs +111 -0
  49. package/rust/cli/discover/fs.rs +19 -0
  50. package/rust/cli/discover/install.rs +103 -0
  51. package/rust/cli/discover/metadata.rs +48 -0
  52. package/rust/cli/discover/mod.rs +5 -0
  53. package/rust/cli/{init.rs → init/commands.rs} +88 -87
  54. package/rust/cli/init/mod.rs +1 -0
  55. package/rust/cli/install/addon.rs +126 -0
  56. package/rust/cli/install/bank.rs +53 -0
  57. package/rust/cli/{install.rs → install/commands.rs} +9 -9
  58. package/rust/{installer → cli/install}/mod.rs +2 -3
  59. package/rust/cli/install/plugin.rs +61 -0
  60. package/rust/cli/{login.rs → login/commands.rs} +8 -11
  61. package/rust/cli/login/mod.rs +1 -0
  62. package/rust/cli/mod.rs +2 -2
  63. package/rust/cli/{driver.rs → parser.rs} +7 -2
  64. package/rust/cli/play/commands.rs +324 -0
  65. package/rust/cli/play/io.rs +17 -0
  66. package/rust/cli/play/mod.rs +5 -0
  67. package/rust/cli/play/process.rs +150 -0
  68. package/rust/cli/play/realtime.rs +91 -0
  69. package/rust/cli/play/utils.rs +23 -0
  70. package/rust/cli/{telemetry.rs → telemetry/commands.rs} +4 -4
  71. package/rust/cli/telemetry/event_creator.rs +80 -0
  72. package/rust/cli/telemetry/mod.rs +3 -0
  73. package/rust/cli/telemetry/send.rs +51 -0
  74. package/rust/cli/{template.rs → template/commands.rs} +1 -1
  75. package/rust/cli/template/mod.rs +1 -0
  76. package/rust/cli/{update.rs → update/commands.rs} +6 -6
  77. package/rust/cli/update/mod.rs +1 -0
  78. package/rust/config/driver.rs +57 -72
  79. package/rust/config/mod.rs +1 -2
  80. package/rust/config/ops.rs +26 -0
  81. package/rust/config/settings.rs +40 -42
  82. package/rust/core/audio/engine/helpers.rs +158 -0
  83. package/rust/core/audio/engine/mod.rs +7 -0
  84. package/rust/core/audio/engine/sample.rs +359 -0
  85. package/rust/core/audio/engine/synth.rs +325 -0
  86. package/rust/core/audio/evaluator.rs +68 -27
  87. package/rust/core/audio/interpreter/arrow_call.rs +113 -33
  88. package/rust/core/audio/interpreter/call.rs +232 -56
  89. package/rust/core/audio/interpreter/condition.rs +3 -2
  90. package/rust/core/audio/interpreter/driver.rs +206 -151
  91. package/rust/core/audio/interpreter/let_.rs +1 -1
  92. package/rust/core/audio/interpreter/load.rs +2 -1
  93. package/rust/core/audio/interpreter/loop_.rs +7 -6
  94. package/rust/core/audio/interpreter/sleep.rs +2 -1
  95. package/rust/core/audio/interpreter/spawn.rs +186 -54
  96. package/rust/core/audio/interpreter/tempo.rs +31 -10
  97. package/rust/core/audio/interpreter/trigger.rs +2 -2
  98. package/rust/core/audio/loader/trigger.rs +4 -7
  99. package/rust/core/audio/player.rs +6 -0
  100. package/rust/core/audio/renderer.rs +5 -7
  101. package/rust/core/audio/special/env.rs +3 -1
  102. package/rust/core/audio/special/math.rs +26 -6
  103. package/rust/core/audio/special/modulator.rs +2 -2
  104. package/rust/core/builder/mod.rs +9 -3
  105. package/rust/core/debugger/lexer.rs +1 -1
  106. package/rust/core/debugger/mod.rs +6 -0
  107. package/rust/core/debugger/module.rs +4 -4
  108. package/rust/core/debugger/preprocessor.rs +1 -1
  109. package/rust/core/debugger/store.rs +2 -2
  110. package/rust/core/error/mod.rs +189 -0
  111. package/rust/core/lexer/driver.rs +61 -0
  112. package/rust/core/lexer/handler/arrow.rs +1 -1
  113. package/rust/core/lexer/handler/at.rs +1 -1
  114. package/rust/core/lexer/handler/brace.rs +2 -2
  115. package/rust/core/lexer/handler/colon.rs +1 -1
  116. package/rust/core/lexer/handler/comment.rs +1 -1
  117. package/rust/core/lexer/handler/dot.rs +1 -1
  118. package/rust/core/lexer/handler/driver.rs +1 -1
  119. package/rust/core/lexer/handler/identifier.rs +4 -3
  120. package/rust/core/lexer/handler/mod.rs +1 -2
  121. package/rust/core/lexer/handler/number.rs +1 -1
  122. package/rust/core/lexer/handler/operator.rs +1 -1
  123. package/rust/core/lexer/handler/parenthesis.rs +2 -2
  124. package/rust/core/lexer/handler/slash.rs +1 -1
  125. package/rust/core/lexer/handler/string.rs +1 -1
  126. package/rust/core/lexer/mod.rs +1 -52
  127. package/rust/core/lexer/token.rs +91 -97
  128. package/rust/core/mod.rs +0 -1
  129. package/rust/core/parser/driver.rs +78 -22
  130. package/rust/core/parser/handler/arrow_call.rs +28 -8
  131. package/rust/core/parser/handler/at.rs +55 -21
  132. package/rust/core/parser/handler/bank.rs +14 -4
  133. package/rust/core/parser/handler/condition.rs +6 -3
  134. package/rust/core/parser/handler/dot.rs +5 -3
  135. package/rust/core/parser/handler/identifier/automate.rs +13 -16
  136. package/rust/core/parser/handler/identifier/call.rs +4 -4
  137. package/rust/core/parser/handler/identifier/emit.rs +9 -5
  138. package/rust/core/parser/handler/identifier/function.rs +20 -7
  139. package/rust/core/parser/handler/identifier/group.rs +11 -7
  140. package/rust/core/parser/handler/identifier/let_.rs +24 -9
  141. package/rust/core/parser/handler/identifier/mod.rs +6 -5
  142. package/rust/core/parser/handler/identifier/on.rs +16 -7
  143. package/rust/core/parser/handler/identifier/print.rs +6 -9
  144. package/rust/core/parser/handler/identifier/sleep.rs +12 -5
  145. package/rust/core/parser/handler/identifier/spawn.rs +4 -4
  146. package/rust/core/parser/handler/identifier/synth.rs +79 -9
  147. package/rust/core/parser/handler/loop_.rs +38 -13
  148. package/rust/core/parser/handler/mod.rs +1 -0
  149. package/rust/core/parser/handler/pattern.rs +74 -0
  150. package/rust/core/parser/handler/tempo.rs +9 -5
  151. package/rust/core/parser/mod.rs +0 -1
  152. package/rust/core/parser/statement.rs +6 -137
  153. package/rust/core/plugin/loader.rs +41 -27
  154. package/rust/core/plugin/runner.rs +68 -17
  155. package/rust/core/preprocessor/loader.rs +181 -99
  156. package/rust/core/preprocessor/processor.rs +9 -9
  157. package/rust/core/preprocessor/resolver/bank.rs +6 -8
  158. package/rust/core/preprocessor/resolver/call.rs +47 -23
  159. package/rust/core/preprocessor/resolver/condition.rs +6 -8
  160. package/rust/core/preprocessor/resolver/driver.rs +28 -28
  161. package/rust/core/preprocessor/resolver/function.rs +6 -6
  162. package/rust/core/preprocessor/resolver/group.rs +6 -8
  163. package/rust/core/preprocessor/resolver/loop_.rs +8 -10
  164. package/rust/core/preprocessor/resolver/mod.rs +1 -0
  165. package/rust/core/preprocessor/resolver/pattern.rs +75 -0
  166. package/rust/core/preprocessor/resolver/spawn.rs +45 -22
  167. package/rust/core/preprocessor/resolver/synth.rs +6 -8
  168. package/rust/core/preprocessor/resolver/tempo.rs +6 -8
  169. package/rust/core/preprocessor/resolver/trigger.rs +22 -19
  170. package/rust/core/preprocessor/resolver/value.rs +99 -4
  171. package/rust/core/store/export.rs +28 -28
  172. package/rust/core/store/function.rs +6 -0
  173. package/rust/core/store/global.rs +7 -1
  174. package/rust/core/store/import.rs +28 -28
  175. package/rust/core/store/variable.rs +16 -2
  176. package/rust/core/utils/mod.rs +0 -1
  177. package/rust/lib.rs +102 -9
  178. package/rust/main.rs +159 -45
  179. package/rust/types/Cargo.toml +11 -0
  180. package/rust/types/src/addons.rs +55 -0
  181. package/rust/types/src/ast.rs +202 -0
  182. package/rust/types/src/config.rs +74 -0
  183. package/rust/types/src/lib.rs +12 -0
  184. package/rust/types/src/telemetry.rs +85 -0
  185. package/rust/utils/Cargo.toml +26 -0
  186. package/rust/utils/{error.rs → src/error.rs} +186 -200
  187. package/rust/utils/src/file.rs +94 -0
  188. package/rust/utils/src/first_usage.rs +97 -0
  189. package/rust/utils/{mod.rs → src/lib.rs} +1 -1
  190. package/rust/utils/{logger.rs → src/logger.rs} +17 -12
  191. package/rust/utils/src/path.rs +88 -0
  192. package/rust/utils/src/signature.rs +41 -0
  193. package/rust/utils/{spinner.rs → src/spinner.rs} +3 -5
  194. package/rust/utils/src/version.rs +27 -0
  195. package/rust/utils/{watcher.rs → src/watcher.rs} +13 -1
  196. package/rust/web/cdn.rs +34 -0
  197. package/templates/minimal/README.md +98 -54
  198. package/templates/welcome/README.md +98 -54
  199. package/templates/welcome/src/index.deva +56 -8
  200. package/templates/welcome/src/variables.deva +2 -4
  201. package/tests/rust/TODO.md +0 -0
  202. package/tests/typescript/index.spec.ts +136 -0
  203. package/tests/typescript/playhead.spec.ts +36 -0
  204. package/tests/typescript/render_e2e.spec.ts +77 -0
  205. package/tsconfig.json +1 -1
  206. package/typescript/core/functions/index.ts +83 -0
  207. package/typescript/core/index.ts +6 -0
  208. package/typescript/core/types/index.ts +4 -0
  209. package/typescript/core/types/plugin.ts +19 -0
  210. package/typescript/core/types/result.ts +29 -0
  211. package/typescript/core/types/statement.ts +47 -0
  212. package/typescript/core/types/value.ts +29 -0
  213. package/typescript/index.ts +7 -2
  214. package/typescript/pkg/devalang_core.d.ts +4 -0
  215. package/typescript/scripts/copy-wasm-dts.ts +41 -0
  216. package/rust/cli/bank.rs +0 -462
  217. package/rust/cli/build.rs +0 -252
  218. package/rust/cli/play.rs +0 -1123
  219. package/rust/common/cdn.rs +0 -5
  220. package/rust/config/loader.rs +0 -165
  221. package/rust/config/stats.rs +0 -257
  222. package/rust/core/audio/engine.rs +0 -696
  223. package/rust/core/shared/bank.rs +0 -21
  224. package/rust/core/shared/duration.rs +0 -9
  225. package/rust/core/shared/mod.rs +0 -3
  226. package/rust/core/shared/value.rs +0 -35
  227. package/rust/core/utils/validation.rs +0 -35
  228. package/rust/installer/addon.rs +0 -84
  229. package/rust/installer/bank.rs +0 -62
  230. package/rust/installer/plugin.rs +0 -54
  231. package/rust/installer/utils.rs +0 -56
  232. package/rust/utils/file.rs +0 -38
  233. package/rust/utils/first_usage.rs +0 -83
  234. package/rust/utils/signature.rs +0 -19
  235. package/rust/utils/telemetry.rs +0 -292
  236. package/rust/utils/version.rs +0 -15
  237. /package/rust/{common → web}/api.rs +0 -0
  238. /package/rust/{common → web}/mod.rs +0 -0
  239. /package/rust/{common → web}/sso.rs +0 -0
package/rust/main.rs CHANGED
@@ -1,53 +1,84 @@
1
1
  #![cfg(feature = "cli")]
2
2
 
3
3
  pub mod cli;
4
- pub mod common;
5
4
  pub mod config;
6
5
  pub mod core;
7
- pub mod installer;
8
- pub mod utils;
6
+ pub mod web;
7
+ use devalang_utils::path::ensure_deva_dir;
8
+ pub use devalang_utils as utils;
9
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;
10
13
  use crate::{
11
14
  cli::{
12
15
  bank::{
13
16
  handle_bank_available_command, handle_bank_info_command, handle_bank_list_command,
14
17
  handle_remove_bank_command, handle_update_bank_command,
15
18
  },
16
- build::handle_build_command,
19
+ build::commands::handle_build_command,
17
20
  check::handle_check_command,
18
- driver::{BankCommand, Cli, Commands, InstallCommand, TelemetryCommand, TemplateCommand},
19
- init::handle_init_command,
20
- install::handle_install_command,
21
- login::handle_login_command,
22
- play::handle_play_command,
23
- telemetry::{handle_telemetry_disable_command, handle_telemetry_enable_command},
24
- template::{handle_template_info_command, handle_template_list_command},
25
- update::handle_update_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,
26
33
  },
27
- config::{driver::ProjectConfig, loader::load_config},
28
- installer::addon::AddonType,
29
- utils::{first_usage::check_is_first_usage, telemetry::TelemetryEventCreator},
34
+ config::driver::ProjectConfig,
35
+ utils::first_usage::check_is_first_usage,
30
36
  };
31
- use clap::Parser;
37
+ use clap::CommandFactory;
38
+ use clap::FromArgMatches;
39
+ use devalang_types::{AddonType, TelemetryErrorLevel};
32
40
  use std::io;
33
41
 
34
42
  #[tokio::main]
35
43
  async fn main() -> io::Result<()> {
36
- let cli: Cli = Cli::parse();
37
- let mut config: Option<ProjectConfig> = None;
44
+ let version = devalang_utils::version::get_version();
45
+ let signature = devalang_utils::signature::get_signature(&version);
38
46
 
39
- let duration = std::time::Instant::now();
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
+ }
40
58
 
41
- check_is_first_usage();
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;
42
62
 
43
63
  let telemetry_event_creator = TelemetryEventCreator::new();
44
64
  let mut event = telemetry_event_creator.get_base_event();
65
+
45
66
  let mut had_error: bool = false;
46
67
  let mut last_error_message: Option<String> = None;
47
68
  let mut exit_code: Option<i32> = None;
48
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
+
49
80
  if !cli.no_config {
50
- config = load_config(None);
81
+ config = config::ops::load_config(None);
51
82
  } else {
52
83
  println!("No configuration file loaded. Running with arguments only.");
53
84
  }
@@ -73,7 +104,11 @@ async fn main() -> io::Result<()> {
73
104
  debug,
74
105
  } => {
75
106
  if let Err(err) = handle_check_command(config, entry, output, watch, debug) {
76
- eprintln!("❌ Check failed: {}", err);
107
+ let logger = devalang_utils::logger::Logger::new();
108
+ logger.log_message(
109
+ devalang_utils::logger::LogLevel::Error,
110
+ &format!("❌ Check failed: {}", err),
111
+ );
77
112
  had_error = true;
78
113
  last_error_message = Some(format!("check failed: {}", err));
79
114
  exit_code = Some(1);
@@ -88,7 +123,11 @@ async fn main() -> io::Result<()> {
88
123
  compress,
89
124
  } => {
90
125
  if let Err(err) = handle_build_command(config, entry, output, watch, debug, compress) {
91
- eprintln!("❌ Build failed: {}", err);
126
+ let logger = devalang_utils::logger::Logger::new();
127
+ logger.log_message(
128
+ devalang_utils::logger::LogLevel::Error,
129
+ &format!("❌ Build failed: {}", err),
130
+ );
92
131
  had_error = true;
93
132
  last_error_message = Some(format!("build failed: {}", err));
94
133
  exit_code = Some(1);
@@ -103,7 +142,11 @@ async fn main() -> io::Result<()> {
103
142
  debug,
104
143
  } => {
105
144
  if let Err(err) = handle_play_command(config, entry, output, watch, repeat, debug) {
106
- eprintln!("❌ Play failed: {}", err);
145
+ let logger = devalang_utils::logger::Logger::new();
146
+ logger.log_message(
147
+ devalang_utils::logger::LogLevel::Error,
148
+ &format!("❌ Play failed: {}", err),
149
+ );
107
150
  had_error = true;
108
151
  last_error_message = Some(format!("play failed: {}", err));
109
152
  exit_code = Some(1);
@@ -111,9 +154,25 @@ async fn main() -> io::Result<()> {
111
154
  }
112
155
 
113
156
  Commands::Install { command } => match command {
157
+ InstallCommand::Template { name } => {
158
+ if let Err(err) = handle_install_command(name, AddonType::Template).await {
159
+ let logger = devalang_utils::logger::Logger::new();
160
+ logger.log_message(
161
+ devalang_utils::logger::LogLevel::Error,
162
+ &format!("❌ Failed to install template: {}", err),
163
+ );
164
+ had_error = true;
165
+ last_error_message = Some(format!("install template failed: {}", err));
166
+ exit_code = Some(1);
167
+ }
168
+ }
114
169
  InstallCommand::Bank { name } => {
115
170
  if let Err(err) = handle_install_command(name, AddonType::Bank).await {
116
- eprintln!("❌ Failed to install bank: {}", err);
171
+ let logger = devalang_utils::logger::Logger::new();
172
+ logger.log_message(
173
+ devalang_utils::logger::LogLevel::Error,
174
+ &format!("❌ Failed to install bank: {}", err),
175
+ );
117
176
  had_error = true;
118
177
  last_error_message = Some(format!("install bank failed: {}", err));
119
178
  exit_code = Some(1);
@@ -121,7 +180,11 @@ async fn main() -> io::Result<()> {
121
180
  }
122
181
  InstallCommand::Plugin { name } => {
123
182
  if let Err(err) = handle_install_command(name, AddonType::Plugin).await {
124
- eprintln!("❌ Failed to install plugin: {}", err);
183
+ let logger = devalang_utils::logger::Logger::new();
184
+ logger.log_message(
185
+ devalang_utils::logger::LogLevel::Error,
186
+ &format!("❌ Failed to install plugin: {}", err),
187
+ );
125
188
  had_error = true;
126
189
  last_error_message = Some(format!("install plugin failed: {}", err));
127
190
  exit_code = Some(1);
@@ -129,7 +192,11 @@ async fn main() -> io::Result<()> {
129
192
  }
130
193
  InstallCommand::Preset { name } => {
131
194
  if let Err(err) = handle_install_command(name, AddonType::Preset).await {
132
- eprintln!("❌ Failed to install preset: {}", err);
195
+ let logger = devalang_utils::logger::Logger::new();
196
+ logger.log_message(
197
+ devalang_utils::logger::LogLevel::Error,
198
+ &format!("❌ Failed to install preset: {}", err),
199
+ );
133
200
  had_error = true;
134
201
  last_error_message = Some(format!("install preset failed: {}", err));
135
202
  exit_code = Some(1);
@@ -140,7 +207,11 @@ async fn main() -> io::Result<()> {
140
207
  Commands::Bank { command } => match command {
141
208
  BankCommand::List => {
142
209
  if let Err(err) = handle_bank_list_command().await {
143
- eprintln!("❌ Failed to list local banks: {}", err);
210
+ let logger = devalang_utils::logger::Logger::new();
211
+ logger.log_message(
212
+ devalang_utils::logger::LogLevel::Error,
213
+ &format!("❌ Failed to list local banks: {}", err),
214
+ );
144
215
  had_error = true;
145
216
  last_error_message = Some(format!("bank list failed: {}", err));
146
217
  exit_code = Some(1);
@@ -149,7 +220,11 @@ async fn main() -> io::Result<()> {
149
220
 
150
221
  BankCommand::Available => {
151
222
  if let Err(err) = handle_bank_available_command().await {
152
- eprintln!("❌ Failed to list available banks: {}", err);
223
+ let logger = devalang_utils::logger::Logger::new();
224
+ logger.log_message(
225
+ devalang_utils::logger::LogLevel::Error,
226
+ &format!("❌ Failed to list available banks: {}", err),
227
+ );
153
228
  had_error = true;
154
229
  last_error_message = Some(format!("bank available failed: {}", err));
155
230
  exit_code = Some(1);
@@ -158,7 +233,11 @@ async fn main() -> io::Result<()> {
158
233
 
159
234
  BankCommand::Info { name } => {
160
235
  if let Err(err) = handle_bank_info_command(name).await {
161
- eprintln!("❌ Failed to get bank info: {}", err);
236
+ let logger = devalang_utils::logger::Logger::new();
237
+ logger.log_message(
238
+ devalang_utils::logger::LogLevel::Error,
239
+ &format!("❌ Failed to get bank info: {}", err),
240
+ );
162
241
  had_error = true;
163
242
  last_error_message = Some(format!("bank info failed: {}", err));
164
243
  exit_code = Some(1);
@@ -167,7 +246,11 @@ async fn main() -> io::Result<()> {
167
246
 
168
247
  BankCommand::Remove { name } => {
169
248
  if let Err(err) = handle_remove_bank_command(name).await {
170
- eprintln!("❌ Failed to remove bank: {}", err);
249
+ let logger = devalang_utils::logger::Logger::new();
250
+ logger.log_message(
251
+ devalang_utils::logger::LogLevel::Error,
252
+ &format!("❌ Failed to remove bank: {}", err),
253
+ );
171
254
  had_error = true;
172
255
  last_error_message = Some(format!("bank remove failed: {}", err));
173
256
  exit_code = Some(1);
@@ -176,7 +259,11 @@ async fn main() -> io::Result<()> {
176
259
 
177
260
  BankCommand::Update { name } => {
178
261
  if let Err(err) = handle_update_bank_command(name).await {
179
- eprintln!("❌ Failed to update bank: {}", err);
262
+ let logger = devalang_utils::logger::Logger::new();
263
+ logger.log_message(
264
+ devalang_utils::logger::LogLevel::Error,
265
+ &format!("❌ Failed to update bank: {}", err),
266
+ );
180
267
  had_error = true;
181
268
  last_error_message = Some(format!("bank update failed: {}", err));
182
269
  exit_code = Some(1);
@@ -186,7 +273,11 @@ async fn main() -> io::Result<()> {
186
273
 
187
274
  Commands::Update { only } => {
188
275
  if let Err(err) = handle_update_command(only).await {
189
- eprintln!("❌ Update failed: {}", err);
276
+ let logger = devalang_utils::logger::Logger::new();
277
+ logger.log_message(
278
+ devalang_utils::logger::LogLevel::Error,
279
+ &format!("❌ Update failed: {}", err),
280
+ );
190
281
  had_error = true;
191
282
  last_error_message = Some(format!("update failed: {}", err));
192
283
  exit_code = Some(1);
@@ -196,7 +287,11 @@ async fn main() -> io::Result<()> {
196
287
  Commands::Telemetry { command } => match command {
197
288
  TelemetryCommand::Enable { .. } => {
198
289
  if let Err(err) = handle_telemetry_enable_command().await {
199
- eprintln!("❌ Failed to enable telemetry: {}", err);
290
+ let logger = devalang_utils::logger::Logger::new();
291
+ logger.log_message(
292
+ devalang_utils::logger::LogLevel::Error,
293
+ &format!("❌ Failed to enable telemetry: {}", err),
294
+ );
200
295
  had_error = true;
201
296
  last_error_message = Some(format!("telemetry enable failed: {}", err));
202
297
  exit_code = Some(1);
@@ -204,7 +299,11 @@ async fn main() -> io::Result<()> {
204
299
  }
205
300
  TelemetryCommand::Disable { .. } => {
206
301
  if let Err(err) = handle_telemetry_disable_command().await {
207
- eprintln!("❌ Failed to disable telemetry: {}", err);
302
+ let logger = devalang_utils::logger::Logger::new();
303
+ logger.log_message(
304
+ devalang_utils::logger::LogLevel::Error,
305
+ &format!("❌ Failed to disable telemetry: {}", err),
306
+ );
208
307
  had_error = true;
209
308
  last_error_message = Some(format!("telemetry disable failed: {}", err));
210
309
  exit_code = Some(1);
@@ -212,9 +311,26 @@ async fn main() -> io::Result<()> {
212
311
  }
213
312
  },
214
313
 
314
+ Commands::Discover {} => {
315
+ if let Err(err) = handle_discover_command().await {
316
+ let logger = devalang_utils::logger::Logger::new();
317
+ logger.log_message(
318
+ devalang_utils::logger::LogLevel::Error,
319
+ &format!("❌ Failed to discover: {}", err),
320
+ );
321
+ had_error = true;
322
+ last_error_message = Some(format!("discover failed: {}", err));
323
+ exit_code = Some(1);
324
+ }
325
+ }
326
+
215
327
  Commands::Login { .. } => {
216
328
  if let Err(err) = handle_login_command().await {
217
- eprintln!("❌ Login failed: {}", err);
329
+ let logger = devalang_utils::logger::Logger::new();
330
+ logger.log_message(
331
+ devalang_utils::logger::LogLevel::Error,
332
+ &format!("❌ Login failed: {}", err),
333
+ );
218
334
  had_error = true;
219
335
  last_error_message = Some(format!("login failed: {}", err));
220
336
  exit_code = Some(1);
@@ -222,7 +338,11 @@ async fn main() -> io::Result<()> {
222
338
  }
223
339
 
224
340
  Commands::Logout { .. } => {
225
- eprintln!("❌ Logout command is not implemented yet.");
341
+ let logger = devalang_utils::logger::Logger::new();
342
+ logger.log_message(
343
+ devalang_utils::logger::LogLevel::Error,
344
+ "❌ Logout command is not implemented yet.",
345
+ );
226
346
  had_error = true;
227
347
  last_error_message = Some("logout not implemented".to_string());
228
348
  exit_code = Some(1);
@@ -235,16 +355,10 @@ async fn main() -> io::Result<()> {
235
355
  event.set_success(!had_error);
236
356
 
237
357
  if had_error {
238
- event.set_error(
239
- utils::telemetry::TelemetryErrorLevel::Critical,
240
- last_error_message,
241
- exit_code,
242
- );
358
+ event.set_error(TelemetryErrorLevel::Critical, last_error_message, exit_code);
243
359
  }
244
360
 
245
- utils::telemetry::refresh_event_project_info(&mut event);
246
-
247
- let _ = utils::telemetry::send_telemetry_event(&event).await;
361
+ let _ = send_telemetry_event(&event).await;
248
362
 
249
363
  Ok(())
250
364
  }
@@ -0,0 +1,11 @@
1
+ [package]
2
+ name = "devalang_types"
3
+ version = "0.0.1"
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
+ }
@@ -0,0 +1,202 @@
1
+ use serde::{Deserialize, Serialize};
2
+ use std::collections::HashMap;
3
+
4
+ #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
5
+ pub enum Duration {
6
+ Number(f32),
7
+ Identifier(String),
8
+ Beat(String),
9
+ Auto,
10
+ }
11
+
12
+ #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
13
+ pub enum Severity {
14
+ Warning,
15
+ Critical,
16
+ }
17
+
18
+ #[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)]
19
+ pub struct StackFrame {
20
+ pub module: Option<String>,
21
+ pub context: Option<String>,
22
+ pub line: usize,
23
+ pub column: usize,
24
+ }
25
+
26
+ #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
27
+ pub struct ErrorResult {
28
+ pub message: String,
29
+ pub line: usize,
30
+ pub column: usize,
31
+ pub severity: Severity,
32
+ pub stack: Vec<StackFrame>,
33
+ }
34
+
35
+ #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
36
+ pub enum StatementKind {
37
+ // ───── Core Instructions ─────
38
+ Tempo,
39
+ Bank {
40
+ alias: Option<String>,
41
+ },
42
+ Print,
43
+ Load {
44
+ source: String,
45
+ alias: String,
46
+ },
47
+ Use {
48
+ name: String,
49
+ alias: Option<String>,
50
+ },
51
+ Let {
52
+ name: String,
53
+ },
54
+ Automate {
55
+ target: String,
56
+ },
57
+ ArrowCall {
58
+ target: String,
59
+ method: String,
60
+ args: Vec<Value>,
61
+ },
62
+ Function {
63
+ name: String,
64
+ parameters: Vec<String>,
65
+ body: Vec<Statement>,
66
+ },
67
+
68
+ // ───── Instruments ─────
69
+ Synth,
70
+
71
+ // ───── Playback / Scheduling ─────
72
+ Trigger {
73
+ entity: String,
74
+ duration: Duration,
75
+ effects: Option<Value>,
76
+ },
77
+ Sleep,
78
+ Call {
79
+ name: String,
80
+ args: Vec<Value>,
81
+ },
82
+ Spawn {
83
+ name: String,
84
+ args: Vec<Value>,
85
+ },
86
+ Loop,
87
+
88
+ // ───── Structure & Logic ─────
89
+ Group,
90
+ Pattern {
91
+ name: String,
92
+ target: Option<String>,
93
+ },
94
+
95
+ // ───── Module System ─────
96
+ Include(String),
97
+ Export {
98
+ names: Vec<String>,
99
+ source: String,
100
+ },
101
+ Import {
102
+ names: Vec<String>,
103
+ source: String,
104
+ },
105
+
106
+ // ───── Conditions ─────
107
+ If,
108
+ Else,
109
+ ElseIf,
110
+
111
+ // ───── Internal / Utility ─────
112
+ Comment,
113
+ Indent,
114
+ Dedent,
115
+ NewLine,
116
+
117
+ // ───── Events / Live coding ─────
118
+ On {
119
+ event: String,
120
+ args: Option<Vec<Value>>,
121
+ body: Vec<Statement>,
122
+ },
123
+ Emit {
124
+ event: String,
125
+ payload: Option<Value>,
126
+ },
127
+
128
+ // ───── Error Handling ─────
129
+ Unknown,
130
+ Error {
131
+ message: String,
132
+ },
133
+ }
134
+
135
+ #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
136
+ pub enum Value {
137
+ Boolean(bool),
138
+ Number(f32),
139
+ Duration(Duration),
140
+ Identifier(String),
141
+ String(String),
142
+ Array(Vec<Value>),
143
+ Map(HashMap<String, Value>),
144
+ Block(Vec<Statement>),
145
+ Sample(String),
146
+ Beat(String),
147
+ Statement(Box<Statement>),
148
+ StatementKind(Box<StatementKind>),
149
+ Unknown,
150
+ Null,
151
+ }
152
+
153
+ impl Value {
154
+ pub fn get(&self, key: &str) -> Option<&Value> {
155
+ if let Value::Map(map) = self {
156
+ map.get(key)
157
+ } else {
158
+ None
159
+ }
160
+ }
161
+ }
162
+
163
+ #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
164
+ pub struct Statement {
165
+ pub kind: StatementKind,
166
+ pub value: Value,
167
+ pub indent: usize,
168
+ pub line: usize,
169
+ pub column: usize,
170
+ }
171
+
172
+ impl Statement {
173
+ pub fn unknown() -> Self {
174
+ Statement {
175
+ kind: StatementKind::Unknown,
176
+ value: Value::Null,
177
+ indent: 0,
178
+ line: 0,
179
+ column: 0,
180
+ }
181
+ }
182
+
183
+ pub fn unknown_with_pos(indent: usize, line: usize, column: usize) -> Self {
184
+ Statement {
185
+ kind: StatementKind::Unknown,
186
+ value: Value::Null,
187
+ indent,
188
+ line,
189
+ column,
190
+ }
191
+ }
192
+
193
+ pub fn error_with_pos(indent: usize, line: usize, column: usize, message: String) -> Self {
194
+ Statement {
195
+ kind: StatementKind::Error { message },
196
+ value: Value::Null,
197
+ indent,
198
+ line,
199
+ column,
200
+ }
201
+ }
202
+ }