@devaloop/devalang 0.0.1-beta.1 → 0.0.1-beta.3
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.
- package/.devalang +9 -10
- package/Cargo.toml +84 -80
- package/README.md +10 -7
- package/docs/CHANGELOG.md +83 -0
- package/docs/ROADMAP.md +6 -2
- package/docs/TODO.md +3 -14
- package/examples/bus.deva +10 -0
- package/examples/chain.deva +19 -0
- package/examples/effect.deva +2 -0
- package/examples/filter.deva +11 -0
- package/examples/lfo.deva +9 -0
- package/examples/plugin.deva +10 -10
- package/examples/routing.deva +23 -0
- package/examples/synth.deva +11 -1
- package/examples/synth_types.deva +17 -0
- package/out-tsc/bin/project-version.json +6 -0
- package/out-tsc/core/functions/index.d.ts +5 -0
- package/out-tsc/core/functions/index.js +11 -0
- package/out-tsc/pkg/devalang_core.d.ts +2 -0
- package/out-tsc/pkg/devalang_core.js +17 -2
- package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +1 -0
- package/out-tsc/scripts/version/copy-to-binary.d.ts +1 -0
- package/out-tsc/scripts/version/copy-to-binary.js +79 -0
- package/package.json +23 -10
- package/project-version.json +3 -3
- package/rust/bindings/Cargo.toml +9 -0
- package/rust/bindings/src/lib.rs +86 -0
- package/rust/cli/addon/commands.rs +35 -0
- package/rust/cli/addon/download.rs +234 -0
- package/rust/cli/addon/install.rs +33 -0
- package/rust/cli/addon/list.rs +224 -0
- package/rust/cli/addon/metadata.rs +124 -0
- package/rust/cli/addon/mod.rs +8 -0
- package/rust/cli/addon/remove.rs +271 -0
- package/rust/cli/addon/update.rs +305 -0
- package/rust/cli/{install/addon.rs → addon/utils.rs} +34 -43
- package/rust/cli/build/commands.rs +153 -103
- package/rust/cli/build/mod.rs +2 -2
- package/rust/cli/build/process.rs +165 -146
- package/rust/cli/check/mod.rs +208 -208
- package/rust/cli/discover/commands.rs +53 -31
- package/rust/cli/discover/config.rs +2 -4
- package/rust/cli/discover/install.rs +139 -28
- package/rust/cli/discover/metadata.rs +3 -3
- package/rust/cli/login/commands.rs +124 -124
- package/rust/cli/me/commands.rs +52 -0
- package/rust/cli/me/mod.rs +1 -0
- package/rust/cli/mod.rs +2 -2
- package/rust/cli/parser.rs +76 -70
- package/rust/cli/play/commands.rs +375 -324
- package/rust/cli/play/mod.rs +5 -5
- package/rust/cli/play/process.rs +159 -150
- package/rust/cli/play/realtime.rs +91 -91
- package/rust/cli/telemetry/commands.rs +22 -22
- package/rust/cli/telemetry/event_creator.rs +80 -80
- package/rust/cli/telemetry/mod.rs +3 -3
- package/rust/cli/telemetry/send.rs +51 -51
- package/rust/cli/template/commands.rs +69 -69
- package/rust/config/driver.rs +112 -103
- package/rust/config/mod.rs +3 -3
- package/rust/config/ops.rs +26 -26
- package/rust/config/settings.rs +101 -101
- package/rust/core/audio/engine/driver.rs +237 -0
- package/rust/core/audio/engine/export.rs +169 -0
- package/rust/core/audio/engine/helpers.rs +178 -170
- package/rust/core/audio/engine/mod.rs +56 -7
- package/rust/core/audio/engine/notes/dsp.rs +88 -0
- package/rust/core/audio/engine/notes/mod.rs +53 -0
- package/rust/core/audio/engine/notes/params.rs +294 -0
- package/rust/core/audio/engine/sample/insert.rs +300 -0
- package/rust/core/audio/engine/sample/mod.rs +40 -0
- package/rust/core/audio/engine/sample/padding.rs +170 -0
- package/rust/core/audio/evaluator/condition.rs +61 -0
- package/rust/core/audio/evaluator/mod.rs +9 -0
- package/rust/core/audio/{evaluator.rs → evaluator/numeric.rs} +152 -310
- package/rust/core/audio/evaluator/rhs.rs +16 -0
- package/rust/core/audio/evaluator/string_expr.rs +94 -0
- package/rust/core/audio/interpreter/driver.rs +574 -542
- package/rust/core/audio/interpreter/mod.rs +2 -14
- package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +179 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +398 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/effects.rs +323 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +3 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +371 -0
- package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +3 -0
- package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +192 -0
- package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +24 -0
- package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +116 -0
- package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +97 -0
- package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +100 -0
- package/rust/core/audio/interpreter/{automate.rs → statements/automate.rs} +2 -4
- package/rust/core/audio/interpreter/{call.rs → statements/call.rs} +36 -5
- package/rust/core/audio/interpreter/{condition.rs → statements/condition.rs} +72 -71
- package/rust/core/audio/interpreter/{function.rs → statements/function.rs} +24 -26
- package/rust/core/audio/interpreter/{let_.rs → statements/let_.rs} +36 -38
- package/rust/core/audio/interpreter/{load.rs → statements/load.rs} +17 -19
- package/rust/core/audio/interpreter/{loop_.rs → statements/loop_.rs} +115 -114
- package/rust/core/audio/interpreter/statements/mod.rs +12 -0
- package/rust/core/audio/interpreter/{sleep.rs → statements/sleep.rs} +28 -28
- package/rust/core/audio/interpreter/{spawn.rs → statements/spawn.rs} +54 -4
- package/rust/core/audio/interpreter/{tempo.rs → statements/tempo.rs} +40 -40
- package/rust/core/audio/interpreter/{trigger.rs → statements/trigger.rs} +242 -239
- package/rust/core/audio/loader/trigger.rs +98 -97
- package/rust/core/audio/mod.rs +6 -7
- package/rust/core/audio/special/easing.rs +189 -189
- package/rust/core/audio/special/env.rs +45 -45
- package/rust/core/audio/special/math.rs +134 -134
- package/rust/core/audio/special/modulator.rs +143 -143
- package/rust/core/builder/mod.rs +129 -86
- package/rust/core/debugger/{module.rs → logs.rs} +52 -55
- package/rust/core/debugger/mod.rs +30 -30
- package/rust/core/debugger/store.rs +38 -40
- package/rust/core/error/mod.rs +269 -269
- package/rust/core/lexer/driver.rs +2 -4
- package/rust/core/mod.rs +9 -10
- package/rust/core/parser/driver/block.rs +111 -0
- package/rust/core/parser/driver/cursor.rs +82 -0
- package/rust/core/parser/driver/driver_impl.rs +159 -0
- package/rust/core/parser/driver/mod.rs +6 -0
- package/rust/core/parser/driver/parse_array.rs +120 -0
- package/rust/core/parser/driver/parse_map.rs +247 -0
- package/rust/core/parser/driver/parser.rs +160 -0
- package/rust/core/parser/handler/arrow_call.rs +90 -15
- package/rust/core/parser/handler/at.rs +279 -279
- package/rust/core/parser/handler/bank.rs +104 -104
- package/rust/core/parser/handler/condition.rs +83 -83
- package/rust/core/parser/handler/dot.rs +148 -148
- package/rust/core/parser/handler/identifier/automate.rs +254 -254
- package/rust/core/parser/handler/identifier/call.rs +91 -91
- package/rust/core/parser/handler/identifier/emit.rs +70 -70
- package/rust/core/parser/handler/identifier/function.rs +113 -113
- package/rust/core/parser/handler/identifier/group.rs +89 -89
- package/rust/core/parser/handler/identifier/let_.rs +173 -173
- package/rust/core/parser/handler/identifier/mod.rs +55 -55
- package/rust/core/parser/handler/identifier/on.rs +107 -107
- package/rust/core/parser/handler/identifier/print.rs +49 -49
- package/rust/core/parser/handler/identifier/sleep.rs +96 -43
- package/rust/core/parser/handler/identifier/spawn.rs +91 -91
- package/rust/core/parser/handler/identifier/synth.rs +39 -3
- package/rust/core/parser/handler/loop_.rs +194 -194
- package/rust/core/parser/handler/pattern.rs +25 -2
- package/rust/core/parser/handler/tempo.rs +105 -57
- package/rust/core/parser/statement.rs +10 -11
- package/rust/core/plugin/loader.rs +137 -137
- package/rust/core/plugin/runner/mod.rs +11 -0
- package/rust/core/plugin/{runner.rs → runner/non_wasm.rs} +206 -72
- package/rust/core/plugin/runner/wasm32.rs +44 -0
- package/rust/core/preprocessor/loader/inject.rs +313 -0
- package/rust/core/preprocessor/loader/loader_helpers.rs +110 -0
- package/rust/core/preprocessor/loader/mod.rs +235 -0
- package/rust/core/preprocessor/module.rs +55 -60
- package/rust/core/preprocessor/{processor.rs → processor/handlers.rs} +107 -114
- package/rust/core/preprocessor/processor/mod.rs +1 -0
- package/rust/core/preprocessor/resolver/function.rs +69 -69
- package/rust/core/preprocessor/resolver/group.rs +122 -94
- package/rust/core/preprocessor/resolver/pattern.rs +14 -2
- package/rust/core/store/global.rs +57 -61
- package/rust/core/store/mod.rs +1 -5
- package/rust/lib.rs +323 -308
- package/rust/macros/Cargo.toml +14 -0
- package/rust/macros/src/lib.rs +52 -0
- package/rust/main.rs +336 -143
- package/rust/types/Cargo.toml +1 -1
- package/rust/types/src/addons.rs +57 -55
- package/rust/types/src/config.rs +82 -74
- package/rust/types/src/lib.rs +15 -12
- package/rust/types/src/plugin.rs +20 -0
- package/rust/types/src/store.rs +139 -0
- package/rust/types/src/telemetry.rs +85 -85
- package/rust/utils/Cargo.toml +5 -2
- package/rust/utils/src/file.rs +477 -94
- package/rust/utils/src/first_usage.rs +97 -97
- package/rust/utils/src/lib.rs +9 -9
- package/rust/utils/src/logger.rs +200 -200
- package/rust/utils/src/path.rs +158 -88
- package/rust/utils/src/signature.rs +41 -41
- package/rust/utils/src/spinner.rs +20 -20
- package/rust/utils/src/version.rs +58 -27
- package/rust/utils/src/watcher.rs +46 -46
- package/rust/web/api.rs +5 -5
- package/rust/web/auth.rs +5 -0
- package/rust/web/cdn.rs +34 -34
- package/rust/web/forge.rs +5 -0
- package/rust/web/mod.rs +2 -0
- package/tests/integration.rs +21 -21
- package/typescript/core/functions/index.ts +11 -0
- package/typescript/pkg/devalang_core.ts +20 -4
- package/typescript/scripts/version/copy-to-binary.ts +82 -0
- package/rust/cli/bank/api.rs +0 -122
- package/rust/cli/bank/commands.rs +0 -275
- package/rust/cli/bank/mod.rs +0 -29
- package/rust/cli/install/bank.rs +0 -53
- package/rust/cli/install/commands.rs +0 -35
- package/rust/cli/install/mod.rs +0 -4
- package/rust/cli/install/plugin.rs +0 -61
- package/rust/core/audio/engine/sample.rs +0 -366
- package/rust/core/audio/engine/synth.rs +0 -325
- package/rust/core/audio/interpreter/arrow_call.rs +0 -311
- package/rust/core/audio/renderer.rs +0 -54
- package/rust/core/parser/driver.rs +0 -584
- package/rust/core/preprocessor/loader.rs +0 -637
- package/rust/core/store/export.rs +0 -28
- package/rust/core/store/function.rs +0 -40
- package/rust/core/store/import.rs +0 -28
- package/rust/core/store/variable.rs +0 -51
- package/rust/core/utils/mod.rs +0 -1
- package/rust/core/utils/path.rs +0 -37
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
use proc_macro::TokenStream;
|
|
2
|
+
use quote::quote;
|
|
3
|
+
use syn::{ parse_macro_input, ItemFn, LitStr };
|
|
4
|
+
|
|
5
|
+
#[proc_macro_attribute]
|
|
6
|
+
pub fn export_plugin(args: TokenStream, item: TokenStream) -> TokenStream {
|
|
7
|
+
let input = parse_macro_input!(item as ItemFn);
|
|
8
|
+
|
|
9
|
+
// default export name = function name
|
|
10
|
+
let export_name = if args.is_empty() {
|
|
11
|
+
input.sig.ident.to_string()
|
|
12
|
+
} else {
|
|
13
|
+
// accept single string literal: #[export_plugin("synth")]
|
|
14
|
+
let s = parse_macro_input!(args as LitStr);
|
|
15
|
+
s.value()
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
let fn_ident = &input.sig.ident;
|
|
19
|
+
let vis = &input.vis;
|
|
20
|
+
let sig = &input.sig;
|
|
21
|
+
let block = &input.block;
|
|
22
|
+
|
|
23
|
+
let wrapper_ident = syn::Ident::new(&export_name, fn_ident.span());
|
|
24
|
+
|
|
25
|
+
let expanded =
|
|
26
|
+
quote! {
|
|
27
|
+
#vis #sig #block
|
|
28
|
+
|
|
29
|
+
#[no_mangle]
|
|
30
|
+
pub extern "C" fn #wrapper_ident(
|
|
31
|
+
out_ptr: *mut f32,
|
|
32
|
+
out_len: i32,
|
|
33
|
+
freq: f32,
|
|
34
|
+
amp: f32,
|
|
35
|
+
duration_ms: i32,
|
|
36
|
+
sample_rate: i32,
|
|
37
|
+
channels: i32,
|
|
38
|
+
) {
|
|
39
|
+
if out_ptr.is_null() { return; }
|
|
40
|
+
let out_len_usz = out_len.max(0) as usize;
|
|
41
|
+
let ch = channels.max(1) as usize;
|
|
42
|
+
let frames = (out_len_usz / ch) as u32;
|
|
43
|
+
let params = devalang_bindings::BufferParams { sample_rate: sample_rate.max(1) as u32, channels: channels.max(1) as u32, frames };
|
|
44
|
+
unsafe {
|
|
45
|
+
let out = core::slice::from_raw_parts_mut(out_ptr, out_len_usz);
|
|
46
|
+
#fn_ident(out, params, devalang_bindings::Note::default(), freq, amp, duration_ms.max(1) as u32);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
TokenStream::from(expanded)
|
|
52
|
+
}
|
package/rust/main.rs
CHANGED
|
@@ -5,38 +5,38 @@ pub mod config;
|
|
|
5
5
|
pub mod core;
|
|
6
6
|
pub mod web;
|
|
7
7
|
pub use devalang_utils as utils;
|
|
8
|
-
use devalang_utils::path::ensure_deva_dir;
|
|
9
8
|
|
|
9
|
+
use crate::cli::addon::commands::handle_install_addon_command;
|
|
10
|
+
use crate::cli::addon::commands::handle_list_addon_command;
|
|
11
|
+
use crate::cli::addon::commands::handle_remove_addon_command;
|
|
12
|
+
use crate::cli::addon::commands::handle_update_addon_command;
|
|
13
|
+
use crate::cli::me::commands::handle_me_command;
|
|
14
|
+
use crate::cli::parser::AddonCommand;
|
|
10
15
|
use crate::cli::telemetry::send::send_telemetry_event;
|
|
11
16
|
use crate::config::settings::ensure_user_config_file_exists;
|
|
12
17
|
use crate::config::settings::write_user_config_file;
|
|
13
18
|
use crate::{
|
|
14
19
|
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
20
|
build::commands::handle_build_command,
|
|
20
21
|
check::handle_check_command,
|
|
21
22
|
discover::commands::handle_discover_command,
|
|
22
23
|
init::commands::handle_init_command,
|
|
23
|
-
install::commands::handle_install_command,
|
|
24
24
|
login::commands::handle_login_command,
|
|
25
|
-
parser::{
|
|
25
|
+
parser::{Cli, Commands, TelemetryCommand, TemplateCommand},
|
|
26
26
|
play::commands::handle_play_command,
|
|
27
27
|
telemetry::{
|
|
28
28
|
commands::{handle_telemetry_disable_command, handle_telemetry_enable_command},
|
|
29
29
|
event_creator::{TelemetryEventCreator, TelemetryEventExt},
|
|
30
30
|
},
|
|
31
31
|
template::commands::{handle_template_info_command, handle_template_list_command},
|
|
32
|
-
update::commands::handle_update_command,
|
|
33
32
|
},
|
|
34
33
|
config::driver::ProjectConfig,
|
|
35
34
|
utils::first_usage::check_is_first_usage,
|
|
36
35
|
};
|
|
37
36
|
use clap::CommandFactory;
|
|
38
37
|
use clap::FromArgMatches;
|
|
39
|
-
use devalang_types::
|
|
38
|
+
use devalang_types::TelemetryErrorLevel;
|
|
39
|
+
use devalang_utils::path::ensure_deva_dir;
|
|
40
40
|
use std::io;
|
|
41
41
|
|
|
42
42
|
#[tokio::main]
|
|
@@ -107,7 +107,7 @@ async fn main() -> io::Result<()> {
|
|
|
107
107
|
let logger = devalang_utils::logger::Logger::new();
|
|
108
108
|
logger.log_message(
|
|
109
109
|
devalang_utils::logger::LogLevel::Error,
|
|
110
|
-
&format!("
|
|
110
|
+
&format!("[error] Check failed: {}", err),
|
|
111
111
|
);
|
|
112
112
|
had_error = true;
|
|
113
113
|
last_error_message = Some(format!("check failed: {}", err));
|
|
@@ -121,12 +121,25 @@ async fn main() -> io::Result<()> {
|
|
|
121
121
|
watch,
|
|
122
122
|
debug,
|
|
123
123
|
compress,
|
|
124
|
+
output_format,
|
|
125
|
+
audio_format,
|
|
126
|
+
sample_rate,
|
|
124
127
|
} => {
|
|
125
|
-
if let Err(err) = handle_build_command(
|
|
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
|
+
) {
|
|
126
139
|
let logger = devalang_utils::logger::Logger::new();
|
|
127
140
|
logger.log_message(
|
|
128
141
|
devalang_utils::logger::LogLevel::Error,
|
|
129
|
-
&format!("
|
|
142
|
+
&format!("[error] Build failed: {}", err),
|
|
130
143
|
);
|
|
131
144
|
had_error = true;
|
|
132
145
|
last_error_message = Some(format!("build failed: {}", err));
|
|
@@ -137,15 +150,26 @@ async fn main() -> io::Result<()> {
|
|
|
137
150
|
Commands::Play {
|
|
138
151
|
entry,
|
|
139
152
|
output,
|
|
153
|
+
sample_rate,
|
|
140
154
|
watch,
|
|
141
155
|
repeat,
|
|
142
156
|
debug,
|
|
157
|
+
audio_format,
|
|
143
158
|
} => {
|
|
144
|
-
if let Err(err) = handle_play_command(
|
|
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
|
+
) {
|
|
145
169
|
let logger = devalang_utils::logger::Logger::new();
|
|
146
170
|
logger.log_message(
|
|
147
171
|
devalang_utils::logger::LogLevel::Error,
|
|
148
|
-
&format!("
|
|
172
|
+
&format!("[error] Play failed: {}", err),
|
|
149
173
|
);
|
|
150
174
|
had_error = true;
|
|
151
175
|
last_error_message = Some(format!("play failed: {}", err));
|
|
@@ -153,144 +177,300 @@ async fn main() -> io::Result<()> {
|
|
|
153
177
|
}
|
|
154
178
|
}
|
|
155
179
|
|
|
156
|
-
Commands::
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
let
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
InstallCommand::Bank { name } => {
|
|
170
|
-
if let Err(err) = handle_install_command(name, AddonType::Bank).await {
|
|
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
|
-
);
|
|
176
|
-
had_error = true;
|
|
177
|
-
last_error_message = Some(format!("install bank failed: {}", err));
|
|
178
|
-
exit_code = Some(1);
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
InstallCommand::Plugin { name } => {
|
|
182
|
-
if let Err(err) = handle_install_command(name, AddonType::Plugin).await {
|
|
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
|
-
);
|
|
188
|
-
had_error = true;
|
|
189
|
-
last_error_message = Some(format!("install plugin failed: {}", err));
|
|
190
|
-
exit_code = Some(1);
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
InstallCommand::Preset { name } => {
|
|
194
|
-
if let Err(err) = handle_install_command(name, AddonType::Preset).await {
|
|
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
|
-
);
|
|
200
|
-
had_error = true;
|
|
201
|
-
last_error_message = Some(format!("install preset failed: {}", err));
|
|
202
|
-
exit_code = Some(1);
|
|
203
|
-
}
|
|
204
|
-
}
|
|
205
|
-
},
|
|
206
|
-
|
|
207
|
-
Commands::Bank { command } => match command {
|
|
208
|
-
BankCommand::List => {
|
|
209
|
-
if let Err(err) = handle_bank_list_command().await {
|
|
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
|
-
);
|
|
215
|
-
had_error = true;
|
|
216
|
-
last_error_message = Some(format!("bank list failed: {}", err));
|
|
217
|
-
exit_code = Some(1);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
BankCommand::Available => {
|
|
222
|
-
if let Err(err) = handle_bank_available_command().await {
|
|
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
|
-
);
|
|
228
|
-
had_error = true;
|
|
229
|
-
last_error_message = Some(format!("bank available failed: {}", err));
|
|
230
|
-
exit_code = Some(1);
|
|
180
|
+
Commands::Addon { command } => {
|
|
181
|
+
match command {
|
|
182
|
+
AddonCommand::Install { name, no_clear_tmp } => {
|
|
183
|
+
if let Err(err) = handle_install_addon_command(name, no_clear_tmp).await {
|
|
184
|
+
let logger = devalang_utils::logger::Logger::new();
|
|
185
|
+
logger.log_message(
|
|
186
|
+
devalang_utils::logger::LogLevel::Error,
|
|
187
|
+
&format!("[error] Failed to install addon: {}", err),
|
|
188
|
+
);
|
|
189
|
+
had_error = true;
|
|
190
|
+
last_error_message = Some(format!("install addon failed: {}", err));
|
|
191
|
+
exit_code = Some(1);
|
|
192
|
+
}
|
|
231
193
|
}
|
|
232
|
-
}
|
|
233
194
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
195
|
+
AddonCommand::Update { name } => {
|
|
196
|
+
if let Err(err) = handle_update_addon_command(name).await {
|
|
197
|
+
let logger = devalang_utils::logger::Logger::new();
|
|
198
|
+
logger.log_message(
|
|
199
|
+
devalang_utils::logger::LogLevel::Error,
|
|
200
|
+
&format!("[error] Failed to update addon: {}", err),
|
|
201
|
+
);
|
|
202
|
+
had_error = true;
|
|
203
|
+
last_error_message = Some(format!("update addon failed: {}", err));
|
|
204
|
+
exit_code = Some(1);
|
|
205
|
+
}
|
|
244
206
|
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
BankCommand::Remove { name } => {
|
|
248
|
-
if let Err(err) = handle_remove_bank_command(name).await {
|
|
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
|
-
);
|
|
254
|
-
had_error = true;
|
|
255
|
-
last_error_message = Some(format!("bank remove failed: {}", err));
|
|
256
|
-
exit_code = Some(1);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
207
|
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
208
|
+
AddonCommand::List {} => {
|
|
209
|
+
if let Err(err) = handle_list_addon_command().await {
|
|
210
|
+
let logger = devalang_utils::logger::Logger::new();
|
|
211
|
+
logger.log_message(
|
|
212
|
+
devalang_utils::logger::LogLevel::Error,
|
|
213
|
+
&format!("[error] Failed to list local addons: {}", err),
|
|
214
|
+
);
|
|
215
|
+
had_error = true;
|
|
216
|
+
last_error_message = Some(format!("addon list failed: {}", err));
|
|
217
|
+
exit_code = Some(1);
|
|
218
|
+
}
|
|
270
219
|
}
|
|
271
|
-
}
|
|
272
|
-
},
|
|
273
220
|
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
221
|
+
AddonCommand::Remove { name } => {
|
|
222
|
+
if let Err(err) = handle_remove_addon_command(name).await {
|
|
223
|
+
let logger = devalang_utils::logger::Logger::new();
|
|
224
|
+
logger.log_message(
|
|
225
|
+
devalang_utils::logger::LogLevel::Error,
|
|
226
|
+
&format!("[error] Failed to remove addon: {}", err),
|
|
227
|
+
);
|
|
228
|
+
had_error = true;
|
|
229
|
+
last_error_message = Some(format!("remove addon failed: {}", err));
|
|
230
|
+
exit_code = Some(1);
|
|
231
|
+
}
|
|
232
|
+
} // AddonCommand::Bank { command } => {
|
|
233
|
+
// match command {
|
|
234
|
+
// BankCommand::List => {
|
|
235
|
+
// if let Err(err) = handle_bank_list_command().await {
|
|
236
|
+
// let logger = devalang_utils::logger::Logger::new();
|
|
237
|
+
// logger.log_message(
|
|
238
|
+
// devalang_utils::logger::LogLevel::Error,
|
|
239
|
+
// &format!("[error] Failed to list local banks: {}", err)
|
|
240
|
+
// );
|
|
241
|
+
// had_error = true;
|
|
242
|
+
// last_error_message = Some(format!("bank list failed: {}", err));
|
|
243
|
+
// exit_code = Some(1);
|
|
244
|
+
// }
|
|
245
|
+
// }
|
|
246
|
+
|
|
247
|
+
// BankCommand::Available => {
|
|
248
|
+
// if let Err(err) = handle_bank_available_command().await {
|
|
249
|
+
// let logger = devalang_utils::logger::Logger::new();
|
|
250
|
+
// logger.log_message(
|
|
251
|
+
// devalang_utils::logger::LogLevel::Error,
|
|
252
|
+
// &format!("[error] Failed to list available banks: {}", err)
|
|
253
|
+
// );
|
|
254
|
+
// had_error = true;
|
|
255
|
+
// last_error_message = Some(
|
|
256
|
+
// format!("bank available failed: {}", err)
|
|
257
|
+
// );
|
|
258
|
+
// exit_code = Some(1);
|
|
259
|
+
// }
|
|
260
|
+
// }
|
|
261
|
+
|
|
262
|
+
// // BankCommand::Info { name } => {
|
|
263
|
+
// // if let Err(err) = handle_bank_info_command(name).await {
|
|
264
|
+
// // let logger = devalang_utils::logger::Logger::new();
|
|
265
|
+
// // logger.log_message(
|
|
266
|
+
// // devalang_utils::logger::LogLevel::Error,
|
|
267
|
+
// // &format!("[error] Failed to get bank info: {}", err)
|
|
268
|
+
// // );
|
|
269
|
+
// // had_error = true;
|
|
270
|
+
// // last_error_message = Some(format!("bank info failed: {}", err));
|
|
271
|
+
// // exit_code = Some(1);
|
|
272
|
+
// // }
|
|
273
|
+
// // }
|
|
274
|
+
|
|
275
|
+
// // BankCommand::Remove { name } => {
|
|
276
|
+
// // if let Err(err) = handle_remove_bank_command(name).await {
|
|
277
|
+
// // let logger = devalang_utils::logger::Logger::new();
|
|
278
|
+
// // logger.log_message(
|
|
279
|
+
// // devalang_utils::logger::LogLevel::Error,
|
|
280
|
+
// // &format!("[error] Failed to remove bank: {}", err)
|
|
281
|
+
// // );
|
|
282
|
+
// // had_error = true;
|
|
283
|
+
// // last_error_message = Some(format!("bank remove failed: {}", err));
|
|
284
|
+
// // exit_code = Some(1);
|
|
285
|
+
// // }
|
|
286
|
+
// // }
|
|
287
|
+
|
|
288
|
+
// // BankCommand::Update { name } => {
|
|
289
|
+
// // if let Err(err) = handle_update_bank_command(name).await {
|
|
290
|
+
// // let logger = devalang_utils::logger::Logger::new();
|
|
291
|
+
// // logger.log_message(
|
|
292
|
+
// // devalang_utils::logger::LogLevel::Error,
|
|
293
|
+
// // &format!("[error] Failed to update bank: {}", err)
|
|
294
|
+
// // );
|
|
295
|
+
// // had_error = true;
|
|
296
|
+
// // last_error_message = Some(format!("bank update failed: {}", err));
|
|
297
|
+
// // exit_code = Some(1);
|
|
298
|
+
// // }
|
|
299
|
+
// // }
|
|
300
|
+
// }
|
|
301
|
+
// }
|
|
302
|
+
|
|
303
|
+
// AddonCommand::Plugin { command} => {
|
|
304
|
+
// match command {
|
|
305
|
+
// PluginCommand::List => {
|
|
306
|
+
// if let Err(err) = handle_plugin_list_command().await {
|
|
307
|
+
// let logger = devalang_utils::logger::Logger::new();
|
|
308
|
+
// logger.log_message(
|
|
309
|
+
// devalang_utils::logger::LogLevel::Error,
|
|
310
|
+
// &format!("[error] Failed to list local plugins: {}", err)
|
|
311
|
+
// );
|
|
312
|
+
// had_error = true;
|
|
313
|
+
// last_error_message = Some(format!("plugin list failed: {}", err));
|
|
314
|
+
// exit_code = Some(1);
|
|
315
|
+
// }
|
|
316
|
+
// }
|
|
317
|
+
|
|
318
|
+
// PluginCommand::Available => {
|
|
319
|
+
// if let Err(err) = handle_plugin_available_command().await {
|
|
320
|
+
// let logger = devalang_utils::logger::Logger::new();
|
|
321
|
+
// logger.log_message(
|
|
322
|
+
// devalang_utils::logger::LogLevel::Error,
|
|
323
|
+
// &format!("[error] Failed to list available plugins: {}", err)
|
|
324
|
+
// );
|
|
325
|
+
// had_error = true;
|
|
326
|
+
// last_error_message = Some(
|
|
327
|
+
// format!("plugin available failed: {}", err)
|
|
328
|
+
// );
|
|
329
|
+
// exit_code = Some(1);
|
|
330
|
+
// }
|
|
331
|
+
// }
|
|
332
|
+
// }
|
|
333
|
+
// }
|
|
284
334
|
}
|
|
285
335
|
}
|
|
286
336
|
|
|
337
|
+
// Commands::Install { command } => match command {
|
|
338
|
+
// InstallCommand::Template { name } => {
|
|
339
|
+
// if let Err(err) = handle_install_command(name, AddonType::Template).await {
|
|
340
|
+
// let logger = devalang_utils::logger::Logger::new();
|
|
341
|
+
// logger.log_message(
|
|
342
|
+
// devalang_utils::logger::LogLevel::Error,
|
|
343
|
+
// &format!("[error] Failed to install template: {}", err),
|
|
344
|
+
// );
|
|
345
|
+
// had_error = true;
|
|
346
|
+
// last_error_message = Some(format!("install template failed: {}", err));
|
|
347
|
+
// exit_code = Some(1);
|
|
348
|
+
// }
|
|
349
|
+
// }
|
|
350
|
+
// InstallCommand::Bank { name } => {
|
|
351
|
+
// if let Err(err) = handle_install_command(name, AddonType::Bank).await {
|
|
352
|
+
// let logger = devalang_utils::logger::Logger::new();
|
|
353
|
+
// logger.log_message(
|
|
354
|
+
// devalang_utils::logger::LogLevel::Error,
|
|
355
|
+
// &format!("[error] Failed to install bank: {}", err),
|
|
356
|
+
// );
|
|
357
|
+
// had_error = true;
|
|
358
|
+
// last_error_message = Some(format!("install bank failed: {}", err));
|
|
359
|
+
// exit_code = Some(1);
|
|
360
|
+
// }
|
|
361
|
+
// }
|
|
362
|
+
// InstallCommand::Plugin { name } => {
|
|
363
|
+
// if let Err(err) = handle_install_command(name, AddonType::Plugin).await {
|
|
364
|
+
// let logger = devalang_utils::logger::Logger::new();
|
|
365
|
+
// logger.log_message(
|
|
366
|
+
// devalang_utils::logger::LogLevel::Error,
|
|
367
|
+
// &format!("[error] Failed to install plugin: {}", err),
|
|
368
|
+
// );
|
|
369
|
+
// had_error = true;
|
|
370
|
+
// last_error_message = Some(format!("install plugin failed: {}", err));
|
|
371
|
+
// exit_code = Some(1);
|
|
372
|
+
// }
|
|
373
|
+
// }
|
|
374
|
+
// InstallCommand::Preset { name } => {
|
|
375
|
+
// if let Err(err) = handle_install_command(name, AddonType::Preset).await {
|
|
376
|
+
// let logger = devalang_utils::logger::Logger::new();
|
|
377
|
+
// logger.log_message(
|
|
378
|
+
// devalang_utils::logger::LogLevel::Error,
|
|
379
|
+
// &format!("[error] Failed to install preset: {}", err),
|
|
380
|
+
// );
|
|
381
|
+
// had_error = true;
|
|
382
|
+
// last_error_message = Some(format!("install preset failed: {}", err));
|
|
383
|
+
// exit_code = Some(1);
|
|
384
|
+
// }
|
|
385
|
+
// }
|
|
386
|
+
// },
|
|
387
|
+
|
|
388
|
+
// Commands::Bank { command } => match command {
|
|
389
|
+
// BankCommand::List => {
|
|
390
|
+
// if let Err(err) = handle_bank_list_command().await {
|
|
391
|
+
// let logger = devalang_utils::logger::Logger::new();
|
|
392
|
+
// logger.log_message(
|
|
393
|
+
// devalang_utils::logger::LogLevel::Error,
|
|
394
|
+
// &format!("[error] Failed to list local banks: {}", err),
|
|
395
|
+
// );
|
|
396
|
+
// had_error = true;
|
|
397
|
+
// last_error_message = Some(format!("bank list failed: {}", err));
|
|
398
|
+
// exit_code = Some(1);
|
|
399
|
+
// }
|
|
400
|
+
// }
|
|
401
|
+
|
|
402
|
+
// BankCommand::Available => {
|
|
403
|
+
// if let Err(err) = handle_bank_available_command().await {
|
|
404
|
+
// let logger = devalang_utils::logger::Logger::new();
|
|
405
|
+
// logger.log_message(
|
|
406
|
+
// devalang_utils::logger::LogLevel::Error,
|
|
407
|
+
// &format!("[error] Failed to list available banks: {}", err),
|
|
408
|
+
// );
|
|
409
|
+
// had_error = true;
|
|
410
|
+
// last_error_message = Some(format!("bank available failed: {}", err));
|
|
411
|
+
// exit_code = Some(1);
|
|
412
|
+
// }
|
|
413
|
+
// }
|
|
414
|
+
|
|
415
|
+
// BankCommand::Info { name } => {
|
|
416
|
+
// if let Err(err) = handle_bank_info_command(name).await {
|
|
417
|
+
// let logger = devalang_utils::logger::Logger::new();
|
|
418
|
+
// logger.log_message(
|
|
419
|
+
// devalang_utils::logger::LogLevel::Error,
|
|
420
|
+
// &format!("[error] Failed to get bank info: {}", err),
|
|
421
|
+
// );
|
|
422
|
+
// had_error = true;
|
|
423
|
+
// last_error_message = Some(format!("bank info failed: {}", err));
|
|
424
|
+
// exit_code = Some(1);
|
|
425
|
+
// }
|
|
426
|
+
// }
|
|
427
|
+
|
|
428
|
+
// BankCommand::Remove { name } => {
|
|
429
|
+
// if let Err(err) = handle_remove_bank_command(name).await {
|
|
430
|
+
// let logger = devalang_utils::logger::Logger::new();
|
|
431
|
+
// logger.log_message(
|
|
432
|
+
// devalang_utils::logger::LogLevel::Error,
|
|
433
|
+
// &format!("[error] Failed to remove bank: {}", err),
|
|
434
|
+
// );
|
|
435
|
+
// had_error = true;
|
|
436
|
+
// last_error_message = Some(format!("bank remove failed: {}", err));
|
|
437
|
+
// exit_code = Some(1);
|
|
438
|
+
// }
|
|
439
|
+
// }
|
|
440
|
+
|
|
441
|
+
// BankCommand::Update { name } => {
|
|
442
|
+
// if let Err(err) = handle_update_bank_command(name).await {
|
|
443
|
+
// let logger = devalang_utils::logger::Logger::new();
|
|
444
|
+
// logger.log_message(
|
|
445
|
+
// devalang_utils::logger::LogLevel::Error,
|
|
446
|
+
// &format!("[error] Failed to update bank: {}", err),
|
|
447
|
+
// );
|
|
448
|
+
// had_error = true;
|
|
449
|
+
// last_error_message = Some(format!("bank update failed: {}", err));
|
|
450
|
+
// exit_code = Some(1);
|
|
451
|
+
// }
|
|
452
|
+
// }
|
|
453
|
+
// },
|
|
454
|
+
|
|
455
|
+
// Commands::Update { only } => {
|
|
456
|
+
// if let Err(err) = handle_update_command(only).await {
|
|
457
|
+
// let logger = devalang_utils::logger::Logger::new();
|
|
458
|
+
// logger.log_message(
|
|
459
|
+
// devalang_utils::logger::LogLevel::Error,
|
|
460
|
+
// &format!("[error] Update failed: {}", err)
|
|
461
|
+
// );
|
|
462
|
+
// had_error = true;
|
|
463
|
+
// last_error_message = Some(format!("update failed: {}", err));
|
|
464
|
+
// exit_code = Some(1);
|
|
465
|
+
// }
|
|
466
|
+
// }
|
|
287
467
|
Commands::Telemetry { command } => match command {
|
|
288
468
|
TelemetryCommand::Enable { .. } => {
|
|
289
469
|
if let Err(err) = handle_telemetry_enable_command().await {
|
|
290
470
|
let logger = devalang_utils::logger::Logger::new();
|
|
291
471
|
logger.log_message(
|
|
292
472
|
devalang_utils::logger::LogLevel::Error,
|
|
293
|
-
&format!("
|
|
473
|
+
&format!("[error] Failed to enable telemetry: {}", err),
|
|
294
474
|
);
|
|
295
475
|
had_error = true;
|
|
296
476
|
last_error_message = Some(format!("telemetry enable failed: {}", err));
|
|
@@ -302,7 +482,7 @@ async fn main() -> io::Result<()> {
|
|
|
302
482
|
let logger = devalang_utils::logger::Logger::new();
|
|
303
483
|
logger.log_message(
|
|
304
484
|
devalang_utils::logger::LogLevel::Error,
|
|
305
|
-
&format!("
|
|
485
|
+
&format!("[error] Failed to disable telemetry: {}", err),
|
|
306
486
|
);
|
|
307
487
|
had_error = true;
|
|
308
488
|
last_error_message = Some(format!("telemetry disable failed: {}", err));
|
|
@@ -311,12 +491,12 @@ async fn main() -> io::Result<()> {
|
|
|
311
491
|
}
|
|
312
492
|
},
|
|
313
493
|
|
|
314
|
-
Commands::Discover {} => {
|
|
315
|
-
if let Err(err) = handle_discover_command().await {
|
|
494
|
+
Commands::Discover { no_clear_tmp } => {
|
|
495
|
+
if let Err(err) = handle_discover_command(no_clear_tmp).await {
|
|
316
496
|
let logger = devalang_utils::logger::Logger::new();
|
|
317
497
|
logger.log_message(
|
|
318
498
|
devalang_utils::logger::LogLevel::Error,
|
|
319
|
-
&format!("
|
|
499
|
+
&format!("[error] Failed to discover: {}", err),
|
|
320
500
|
);
|
|
321
501
|
had_error = true;
|
|
322
502
|
last_error_message = Some(format!("discover failed: {}", err));
|
|
@@ -329,7 +509,7 @@ async fn main() -> io::Result<()> {
|
|
|
329
509
|
let logger = devalang_utils::logger::Logger::new();
|
|
330
510
|
logger.log_message(
|
|
331
511
|
devalang_utils::logger::LogLevel::Error,
|
|
332
|
-
&format!("
|
|
512
|
+
&format!("[error] Login failed: {}", err),
|
|
333
513
|
);
|
|
334
514
|
had_error = true;
|
|
335
515
|
last_error_message = Some(format!("login failed: {}", err));
|
|
@@ -337,11 +517,24 @@ async fn main() -> io::Result<()> {
|
|
|
337
517
|
}
|
|
338
518
|
}
|
|
339
519
|
|
|
520
|
+
Commands::Me {} => {
|
|
521
|
+
if let Err(err) = handle_me_command().await {
|
|
522
|
+
let logger = devalang_utils::logger::Logger::new();
|
|
523
|
+
logger.log_message(
|
|
524
|
+
devalang_utils::logger::LogLevel::Error,
|
|
525
|
+
&format!("[error] Me command failed: {}", err),
|
|
526
|
+
);
|
|
527
|
+
had_error = true;
|
|
528
|
+
last_error_message = Some(format!("me command failed: {}", err));
|
|
529
|
+
exit_code = Some(1);
|
|
530
|
+
}
|
|
531
|
+
}
|
|
532
|
+
|
|
340
533
|
Commands::Logout { .. } => {
|
|
341
534
|
let logger = devalang_utils::logger::Logger::new();
|
|
342
535
|
logger.log_message(
|
|
343
536
|
devalang_utils::logger::LogLevel::Error,
|
|
344
|
-
"
|
|
537
|
+
"[error] Logout command is not implemented yet.",
|
|
345
538
|
);
|
|
346
539
|
had_error = true;
|
|
347
540
|
last_error_message = Some("logout not implemented".to_string());
|