@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.
- package/.cargo/config.toml +2 -0
- package/.devalang +10 -10
- package/.github/workflows/ci.yml +0 -1
- package/Cargo.toml +18 -2
- package/README.md +82 -34
- package/docs/CHANGELOG.md +91 -0
- package/docs/ROADMAP.md +7 -4
- package/docs/TODO.md +1 -1
- package/examples/index.deva +55 -35
- package/examples/pattern.deva +5 -5
- package/out-tsc/bin/index.d.ts +2 -0
- package/out-tsc/core/functions/index.d.ts +37 -0
- package/out-tsc/core/functions/index.js +76 -0
- package/out-tsc/core/index.d.ts +6 -0
- package/out-tsc/core/index.js +22 -0
- package/out-tsc/core/types/index.d.ts +4 -0
- package/out-tsc/core/types/index.js +20 -0
- package/out-tsc/core/types/plugin.d.ts +18 -0
- package/out-tsc/core/types/plugin.js +2 -0
- package/out-tsc/core/types/result.d.ts +27 -0
- package/out-tsc/core/types/result.js +2 -0
- package/out-tsc/core/types/statement.d.ts +106 -0
- package/out-tsc/core/types/statement.js +2 -0
- package/out-tsc/core/types/value.d.ts +43 -0
- package/out-tsc/core/types/value.js +2 -0
- package/out-tsc/index.d.ts +7 -0
- package/out-tsc/index.js +41 -2
- package/out-tsc/pkg/devalang_core.d.ts +7 -0
- package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +33 -0
- package/out-tsc/scripts/copy-wasm-dts.d.ts +1 -0
- package/out-tsc/scripts/copy-wasm-dts.js +73 -0
- package/out-tsc/scripts/postinstall.d.ts +1 -0
- package/out-tsc/scripts/postinstall.js +33 -23
- package/out-tsc/scripts/version/bump.d.ts +1 -0
- package/out-tsc/scripts/version/fetch.d.ts +1 -0
- package/out-tsc/scripts/version/index.d.ts +1 -0
- package/out-tsc/scripts/version/sync.d.ts +1 -0
- package/package.json +16 -4
- package/project-version.json +3 -3
- package/rust/cli/bank/api.rs +122 -0
- package/rust/cli/bank/commands.rs +275 -0
- package/rust/cli/bank/mod.rs +29 -0
- package/rust/cli/build/commands.rs +107 -0
- package/rust/cli/build/mod.rs +2 -0
- package/rust/cli/build/process.rs +146 -0
- package/rust/cli/{check.rs → check/mod.rs} +18 -31
- package/rust/cli/discover/commands.rs +253 -0
- package/rust/cli/discover/config.rs +111 -0
- package/rust/cli/discover/fs.rs +19 -0
- package/rust/cli/discover/install.rs +103 -0
- package/rust/cli/discover/metadata.rs +48 -0
- package/rust/cli/discover/mod.rs +5 -0
- package/rust/cli/{init.rs → init/commands.rs} +88 -87
- package/rust/cli/init/mod.rs +1 -0
- package/rust/cli/install/addon.rs +126 -0
- package/rust/cli/install/bank.rs +53 -0
- package/rust/cli/{install.rs → install/commands.rs} +9 -9
- package/rust/{installer → cli/install}/mod.rs +2 -3
- package/rust/cli/install/plugin.rs +61 -0
- package/rust/cli/{login.rs → login/commands.rs} +8 -11
- package/rust/cli/login/mod.rs +1 -0
- package/rust/cli/mod.rs +2 -2
- package/rust/cli/{driver.rs → parser.rs} +7 -2
- package/rust/cli/play/commands.rs +324 -0
- package/rust/cli/play/io.rs +17 -0
- package/rust/cli/play/mod.rs +5 -0
- package/rust/cli/play/process.rs +150 -0
- package/rust/cli/play/realtime.rs +91 -0
- package/rust/cli/play/utils.rs +23 -0
- package/rust/cli/{telemetry.rs → telemetry/commands.rs} +4 -4
- package/rust/cli/telemetry/event_creator.rs +80 -0
- package/rust/cli/telemetry/mod.rs +3 -0
- package/rust/cli/telemetry/send.rs +51 -0
- package/rust/cli/{template.rs → template/commands.rs} +1 -1
- package/rust/cli/template/mod.rs +1 -0
- package/rust/cli/{update.rs → update/commands.rs} +6 -6
- package/rust/cli/update/mod.rs +1 -0
- package/rust/config/driver.rs +57 -72
- package/rust/config/mod.rs +1 -2
- package/rust/config/ops.rs +26 -0
- package/rust/config/settings.rs +40 -42
- package/rust/core/audio/engine/helpers.rs +158 -0
- package/rust/core/audio/engine/mod.rs +7 -0
- package/rust/core/audio/engine/sample.rs +359 -0
- package/rust/core/audio/engine/synth.rs +325 -0
- package/rust/core/audio/evaluator.rs +68 -27
- package/rust/core/audio/interpreter/arrow_call.rs +113 -33
- package/rust/core/audio/interpreter/call.rs +232 -56
- package/rust/core/audio/interpreter/condition.rs +3 -2
- package/rust/core/audio/interpreter/driver.rs +206 -151
- package/rust/core/audio/interpreter/let_.rs +1 -1
- package/rust/core/audio/interpreter/load.rs +2 -1
- package/rust/core/audio/interpreter/loop_.rs +7 -6
- package/rust/core/audio/interpreter/sleep.rs +2 -1
- package/rust/core/audio/interpreter/spawn.rs +186 -54
- package/rust/core/audio/interpreter/tempo.rs +31 -10
- package/rust/core/audio/interpreter/trigger.rs +2 -2
- package/rust/core/audio/loader/trigger.rs +4 -7
- package/rust/core/audio/player.rs +6 -0
- package/rust/core/audio/renderer.rs +5 -7
- package/rust/core/audio/special/env.rs +3 -1
- package/rust/core/audio/special/math.rs +26 -6
- package/rust/core/audio/special/modulator.rs +2 -2
- package/rust/core/builder/mod.rs +9 -3
- package/rust/core/debugger/lexer.rs +1 -1
- package/rust/core/debugger/mod.rs +6 -0
- package/rust/core/debugger/module.rs +4 -4
- package/rust/core/debugger/preprocessor.rs +1 -1
- package/rust/core/debugger/store.rs +2 -2
- package/rust/core/error/mod.rs +189 -0
- package/rust/core/lexer/driver.rs +61 -0
- package/rust/core/lexer/handler/arrow.rs +1 -1
- package/rust/core/lexer/handler/at.rs +1 -1
- package/rust/core/lexer/handler/brace.rs +2 -2
- package/rust/core/lexer/handler/colon.rs +1 -1
- package/rust/core/lexer/handler/comment.rs +1 -1
- package/rust/core/lexer/handler/dot.rs +1 -1
- package/rust/core/lexer/handler/driver.rs +1 -1
- package/rust/core/lexer/handler/identifier.rs +4 -3
- package/rust/core/lexer/handler/mod.rs +1 -2
- package/rust/core/lexer/handler/number.rs +1 -1
- package/rust/core/lexer/handler/operator.rs +1 -1
- package/rust/core/lexer/handler/parenthesis.rs +2 -2
- package/rust/core/lexer/handler/slash.rs +1 -1
- package/rust/core/lexer/handler/string.rs +1 -1
- package/rust/core/lexer/mod.rs +1 -52
- package/rust/core/lexer/token.rs +91 -97
- package/rust/core/mod.rs +0 -1
- package/rust/core/parser/driver.rs +78 -22
- package/rust/core/parser/handler/arrow_call.rs +28 -8
- package/rust/core/parser/handler/at.rs +55 -21
- package/rust/core/parser/handler/bank.rs +14 -4
- package/rust/core/parser/handler/condition.rs +6 -3
- package/rust/core/parser/handler/dot.rs +5 -3
- package/rust/core/parser/handler/identifier/automate.rs +13 -16
- package/rust/core/parser/handler/identifier/call.rs +4 -4
- package/rust/core/parser/handler/identifier/emit.rs +9 -5
- package/rust/core/parser/handler/identifier/function.rs +20 -7
- package/rust/core/parser/handler/identifier/group.rs +11 -7
- package/rust/core/parser/handler/identifier/let_.rs +24 -9
- package/rust/core/parser/handler/identifier/mod.rs +6 -5
- package/rust/core/parser/handler/identifier/on.rs +16 -7
- package/rust/core/parser/handler/identifier/print.rs +6 -9
- package/rust/core/parser/handler/identifier/sleep.rs +12 -5
- package/rust/core/parser/handler/identifier/spawn.rs +4 -4
- package/rust/core/parser/handler/identifier/synth.rs +79 -9
- package/rust/core/parser/handler/loop_.rs +38 -13
- package/rust/core/parser/handler/mod.rs +1 -0
- package/rust/core/parser/handler/pattern.rs +74 -0
- package/rust/core/parser/handler/tempo.rs +9 -5
- package/rust/core/parser/mod.rs +0 -1
- package/rust/core/parser/statement.rs +6 -137
- package/rust/core/plugin/loader.rs +41 -27
- package/rust/core/plugin/runner.rs +68 -17
- package/rust/core/preprocessor/loader.rs +181 -99
- package/rust/core/preprocessor/processor.rs +9 -9
- package/rust/core/preprocessor/resolver/bank.rs +6 -8
- package/rust/core/preprocessor/resolver/call.rs +47 -23
- package/rust/core/preprocessor/resolver/condition.rs +6 -8
- package/rust/core/preprocessor/resolver/driver.rs +28 -28
- package/rust/core/preprocessor/resolver/function.rs +6 -6
- package/rust/core/preprocessor/resolver/group.rs +6 -8
- package/rust/core/preprocessor/resolver/loop_.rs +8 -10
- package/rust/core/preprocessor/resolver/mod.rs +1 -0
- package/rust/core/preprocessor/resolver/pattern.rs +75 -0
- package/rust/core/preprocessor/resolver/spawn.rs +45 -22
- package/rust/core/preprocessor/resolver/synth.rs +6 -8
- package/rust/core/preprocessor/resolver/tempo.rs +6 -8
- package/rust/core/preprocessor/resolver/trigger.rs +22 -19
- package/rust/core/preprocessor/resolver/value.rs +99 -4
- package/rust/core/store/export.rs +28 -28
- package/rust/core/store/function.rs +6 -0
- package/rust/core/store/global.rs +7 -1
- package/rust/core/store/import.rs +28 -28
- package/rust/core/store/variable.rs +16 -2
- package/rust/core/utils/mod.rs +0 -1
- package/rust/lib.rs +102 -9
- package/rust/main.rs +159 -45
- package/rust/types/Cargo.toml +11 -0
- package/rust/types/src/addons.rs +55 -0
- package/rust/types/src/ast.rs +202 -0
- package/rust/types/src/config.rs +74 -0
- package/rust/types/src/lib.rs +12 -0
- package/rust/types/src/telemetry.rs +85 -0
- package/rust/utils/Cargo.toml +26 -0
- package/rust/utils/{error.rs → src/error.rs} +186 -200
- package/rust/utils/src/file.rs +94 -0
- package/rust/utils/src/first_usage.rs +97 -0
- package/rust/utils/{mod.rs → src/lib.rs} +1 -1
- package/rust/utils/{logger.rs → src/logger.rs} +17 -12
- package/rust/utils/src/path.rs +88 -0
- package/rust/utils/src/signature.rs +41 -0
- package/rust/utils/{spinner.rs → src/spinner.rs} +3 -5
- package/rust/utils/src/version.rs +27 -0
- package/rust/utils/{watcher.rs → src/watcher.rs} +13 -1
- package/rust/web/cdn.rs +34 -0
- package/templates/minimal/README.md +98 -54
- package/templates/welcome/README.md +98 -54
- package/templates/welcome/src/index.deva +56 -8
- package/templates/welcome/src/variables.deva +2 -4
- package/tests/rust/TODO.md +0 -0
- package/tests/typescript/index.spec.ts +136 -0
- package/tests/typescript/playhead.spec.ts +36 -0
- package/tests/typescript/render_e2e.spec.ts +77 -0
- package/tsconfig.json +1 -1
- package/typescript/core/functions/index.ts +83 -0
- package/typescript/core/index.ts +6 -0
- package/typescript/core/types/index.ts +4 -0
- package/typescript/core/types/plugin.ts +19 -0
- package/typescript/core/types/result.ts +29 -0
- package/typescript/core/types/statement.ts +47 -0
- package/typescript/core/types/value.ts +29 -0
- package/typescript/index.ts +7 -2
- package/typescript/pkg/devalang_core.d.ts +4 -0
- package/typescript/scripts/copy-wasm-dts.ts +41 -0
- package/rust/cli/bank.rs +0 -462
- package/rust/cli/build.rs +0 -252
- package/rust/cli/play.rs +0 -1123
- package/rust/common/cdn.rs +0 -5
- package/rust/config/loader.rs +0 -165
- package/rust/config/stats.rs +0 -257
- package/rust/core/audio/engine.rs +0 -696
- package/rust/core/shared/bank.rs +0 -21
- package/rust/core/shared/duration.rs +0 -9
- package/rust/core/shared/mod.rs +0 -3
- package/rust/core/shared/value.rs +0 -35
- package/rust/core/utils/validation.rs +0 -35
- package/rust/installer/addon.rs +0 -84
- package/rust/installer/bank.rs +0 -62
- package/rust/installer/plugin.rs +0 -54
- package/rust/installer/utils.rs +0 -56
- package/rust/utils/file.rs +0 -38
- package/rust/utils/first_usage.rs +0 -83
- package/rust/utils/signature.rs +0 -19
- package/rust/utils/telemetry.rs +0 -292
- package/rust/utils/version.rs +0 -15
- /package/rust/{common → web}/api.rs +0 -0
- /package/rust/{common → web}/mod.rs +0 -0
- /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
|
|
8
|
-
|
|
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
|
-
|
|
19
|
-
init::handle_init_command,
|
|
20
|
-
install::handle_install_command,
|
|
21
|
-
login::handle_login_command,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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::
|
|
28
|
-
|
|
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::
|
|
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
|
|
37
|
-
let
|
|
44
|
+
let version = devalang_utils::version::get_version();
|
|
45
|
+
let signature = devalang_utils::signature::get_signature(&version);
|
|
38
46
|
|
|
39
|
-
let
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
}
|