@devaloop/devalang 0.0.1-alpha.13 → 0.0.1-alpha.14
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 +8 -9
- package/Cargo.toml +58 -54
- package/README.md +36 -21
- package/docs/CHANGELOG.md +40 -2
- package/docs/CONTRIBUTING.md +1 -0
- package/docs/ROADMAP.md +2 -2
- package/docs/TODO.md +5 -4
- package/examples/bank.deva +2 -4
- package/examples/function.deva +15 -0
- package/examples/index.deva +25 -11
- package/out-tsc/bin/devalang.exe +0 -0
- package/package.json +6 -6
- package/project-version.json +3 -3
- package/rust/cli/bank.rs +2 -1
- package/rust/cli/build.rs +69 -30
- package/rust/cli/check.rs +45 -5
- package/rust/cli/driver.rs +40 -28
- package/rust/cli/install.rs +22 -7
- package/rust/cli/login.rs +134 -0
- package/rust/cli/mod.rs +2 -1
- package/rust/cli/play.rs +44 -19
- package/rust/common/api.rs +8 -0
- package/rust/common/cdn.rs +2 -5
- package/rust/common/mod.rs +3 -1
- package/rust/common/sso.rs +8 -0
- package/rust/config/driver.rs +19 -1
- package/rust/config/loader.rs +56 -10
- package/rust/core/audio/engine.rs +152 -42
- package/rust/core/audio/interpreter/arrow_call.rs +34 -15
- package/rust/core/audio/interpreter/call.rs +2 -2
- package/rust/core/audio/interpreter/driver.rs +19 -14
- package/rust/core/audio/interpreter/spawn.rs +2 -2
- package/rust/core/builder/mod.rs +11 -6
- package/rust/core/lexer/handler/indent.rs +16 -2
- package/rust/core/lexer/token.rs +1 -0
- package/rust/core/mod.rs +2 -1
- package/rust/core/parser/driver.rs +46 -5
- package/rust/core/parser/handler/arrow_call.rs +78 -18
- package/rust/core/parser/handler/bank.rs +35 -7
- package/rust/core/parser/handler/dot.rs +43 -22
- package/rust/core/plugin/loader.rs +48 -0
- package/rust/core/plugin/mod.rs +1 -0
- package/rust/core/preprocessor/loader.rs +6 -4
- package/rust/installer/addon.rs +80 -0
- package/rust/installer/bank.rs +24 -14
- package/rust/installer/mod.rs +4 -1
- package/rust/installer/plugin.rs +55 -0
- package/rust/main.rs +32 -9
- package/rust/utils/logger.rs +16 -0
- package/rust/utils/spinner.rs +2 -4
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
use std::path::{ Path, PathBuf };
|
|
2
|
+
use crate::{
|
|
3
|
+
common::cdn::get_cdn_url,
|
|
4
|
+
config::loader::{ add_plugin_to_config, load_config },
|
|
5
|
+
installer::utils::{ download_file, extract_archive },
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
pub async fn install_plugin(name: &str, target_dir: &Path) -> Result<(), String> {
|
|
9
|
+
let cdn_url = get_cdn_url();
|
|
10
|
+
let url = format!("{}/plugin/{}/download", cdn_url, name);
|
|
11
|
+
|
|
12
|
+
let plugin_dir = target_dir.join("plugin");
|
|
13
|
+
let archive_path = PathBuf::from(format!("./.deva/tmp/{}.devaplugin", name));
|
|
14
|
+
let extract_path = plugin_dir.join(name);
|
|
15
|
+
|
|
16
|
+
if extract_path.exists() {
|
|
17
|
+
println!(
|
|
18
|
+
"Plugin '{}' already exists at '{}'. Skipping install.",
|
|
19
|
+
name,
|
|
20
|
+
extract_path.display()
|
|
21
|
+
);
|
|
22
|
+
return Ok(());
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
download_file(&url, &archive_path).await.map_err(|e| format!("Failed to download: {}", e))?;
|
|
26
|
+
|
|
27
|
+
extract_archive(&archive_path, &extract_path).await.map_err(|e|
|
|
28
|
+
format!("Failed to extract: {}", e)
|
|
29
|
+
)?;
|
|
30
|
+
|
|
31
|
+
// Add the plugin to the config
|
|
32
|
+
let root_dir = target_dir
|
|
33
|
+
.parent()
|
|
34
|
+
.ok_or_else(|| "Failed to determine root directory".to_string())?;
|
|
35
|
+
|
|
36
|
+
let config_path = root_dir.join(".devalang");
|
|
37
|
+
if (!config_path.exists()) {
|
|
38
|
+
return Err(
|
|
39
|
+
format!(
|
|
40
|
+
"Config file not found at '{}'. Please run 'devalang init' before adding an addon",
|
|
41
|
+
config_path.display()
|
|
42
|
+
)
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let mut config = load_config(Some(&config_path)).ok_or_else(||
|
|
47
|
+
format!("Failed to load config from '{}'", config_path.display())
|
|
48
|
+
)?;
|
|
49
|
+
|
|
50
|
+
let dependency_path = &format!("devalang://plugin/{}", name);
|
|
51
|
+
|
|
52
|
+
add_plugin_to_config(&mut config, &extract_path, &dependency_path);
|
|
53
|
+
|
|
54
|
+
Ok(())
|
|
55
|
+
}
|
package/rust/main.rs
CHANGED
|
@@ -15,18 +15,21 @@ use crate::{
|
|
|
15
15
|
handle_bank_available_command,
|
|
16
16
|
handle_bank_info_command,
|
|
17
17
|
handle_bank_list_command,
|
|
18
|
-
handle_remove_bank_command,
|
|
18
|
+
handle_remove_bank_command,
|
|
19
|
+
handle_update_bank_command,
|
|
19
20
|
},
|
|
20
21
|
build::handle_build_command,
|
|
21
22
|
check::handle_check_command,
|
|
22
23
|
driver::{ BankCommand, Cli, Commands, InstallCommand, TemplateCommand },
|
|
23
24
|
init::handle_init_command,
|
|
24
|
-
install::
|
|
25
|
+
install::handle_install_command,
|
|
26
|
+
login::handle_login_command,
|
|
25
27
|
play::handle_play_command,
|
|
26
28
|
template::{ handle_template_info_command, handle_template_list_command },
|
|
27
29
|
update::handle_update_command,
|
|
28
30
|
},
|
|
29
31
|
config::{ driver::Config, loader::load_config },
|
|
32
|
+
installer::addon::AddonType,
|
|
30
33
|
};
|
|
31
34
|
|
|
32
35
|
#[tokio::main]
|
|
@@ -55,25 +58,35 @@ async fn main() -> io::Result<()> {
|
|
|
55
58
|
}
|
|
56
59
|
}
|
|
57
60
|
|
|
58
|
-
Commands::Check { entry, output, watch,
|
|
59
|
-
handle_check_command(config, entry, output, watch);
|
|
61
|
+
Commands::Check { entry, output, watch, debug } => {
|
|
62
|
+
handle_check_command(config, entry, output, watch, debug);
|
|
60
63
|
}
|
|
61
64
|
|
|
62
|
-
Commands::Build { entry, output, watch,
|
|
63
|
-
handle_build_command(config, entry, output, watch);
|
|
65
|
+
Commands::Build { entry, output, watch, debug, compress } => {
|
|
66
|
+
handle_build_command(config, entry, output, watch, debug, compress);
|
|
64
67
|
}
|
|
65
68
|
|
|
66
|
-
Commands::Play { entry, output, watch, repeat } => {
|
|
67
|
-
handle_play_command(config, entry, output, watch, repeat);
|
|
69
|
+
Commands::Play { entry, output, watch, repeat, debug } => {
|
|
70
|
+
handle_play_command(config, entry, output, watch, repeat, debug);
|
|
68
71
|
}
|
|
69
72
|
|
|
70
73
|
Commands::Install { command } =>
|
|
71
74
|
match command {
|
|
72
75
|
InstallCommand::Bank { name } => {
|
|
73
|
-
if let Err(err) =
|
|
76
|
+
if let Err(err) = handle_install_command(name, AddonType::Bank).await {
|
|
74
77
|
eprintln!("❌ Failed to install bank: {}", err);
|
|
75
78
|
}
|
|
76
79
|
}
|
|
80
|
+
InstallCommand::Plugin { name } => {
|
|
81
|
+
if let Err(err) = handle_install_command(name, AddonType::Plugin).await {
|
|
82
|
+
eprintln!("❌ Failed to install plugin: {}", err);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
InstallCommand::Preset { name } => {
|
|
86
|
+
if let Err(err) = handle_install_command(name, AddonType::Preset).await {
|
|
87
|
+
eprintln!("❌ Failed to install preset: {}", err);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
77
90
|
}
|
|
78
91
|
|
|
79
92
|
Commands::Bank { command } =>
|
|
@@ -115,6 +128,16 @@ async fn main() -> io::Result<()> {
|
|
|
115
128
|
}
|
|
116
129
|
}
|
|
117
130
|
|
|
131
|
+
Commands::Login { .. } => {
|
|
132
|
+
if let Err(err) = handle_login_command().await {
|
|
133
|
+
eprintln!("❌ Login failed: {}", err);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
Commands::Logout { .. } => {
|
|
138
|
+
eprintln!("❌ Logout command is not implemented yet.");
|
|
139
|
+
}
|
|
140
|
+
|
|
118
141
|
_ => {}
|
|
119
142
|
}
|
|
120
143
|
|
package/rust/utils/logger.rs
CHANGED
|
@@ -33,6 +33,22 @@ impl Logger {
|
|
|
33
33
|
// no-op for WASM
|
|
34
34
|
}
|
|
35
35
|
|
|
36
|
+
// --- log_message_with_trace ---
|
|
37
|
+
|
|
38
|
+
#[cfg(feature = "cli")]
|
|
39
|
+
pub fn log_message_with_trace(&self, level: LogLevel, message: &str, trace: Vec<&str>) {
|
|
40
|
+
let formatted_status = self.format_status(level);
|
|
41
|
+
println!("🦊 {} {} {}", self.language_signature(), formatted_status, message);
|
|
42
|
+
for t in trace {
|
|
43
|
+
println!(" ↳ {}", t);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
#[cfg(not(feature = "cli"))]
|
|
48
|
+
pub fn log_message_with_trace(&self, _level: LogLevel, _message: &str, _trace: Vec<&str>) {
|
|
49
|
+
// no-op for WASM
|
|
50
|
+
}
|
|
51
|
+
|
|
36
52
|
// --- log_error_with_stacktrace ---
|
|
37
53
|
|
|
38
54
|
#[cfg(feature = "cli")]
|
package/rust/utils/spinner.rs
CHANGED
|
@@ -3,7 +3,7 @@ use indicatif::{ ProgressBar, ProgressStyle };
|
|
|
3
3
|
use std::{ time::Duration };
|
|
4
4
|
|
|
5
5
|
#[cfg(feature = "cli")]
|
|
6
|
-
pub fn with_spinner<T, F>(start_msg: &str, f: F) ->
|
|
6
|
+
pub fn with_spinner<T, F>(start_msg: &str, f: F) -> ProgressBar where F: FnOnce() -> T {
|
|
7
7
|
let spinner = ProgressBar::new_spinner();
|
|
8
8
|
spinner.set_style(
|
|
9
9
|
ProgressStyle::with_template("{spinner:.green} {msg}")
|
|
@@ -15,7 +15,5 @@ pub fn with_spinner<T, F>(start_msg: &str, f: F) -> T where F: FnOnce() -> T {
|
|
|
15
15
|
|
|
16
16
|
let result = f();
|
|
17
17
|
|
|
18
|
-
spinner
|
|
19
|
-
|
|
20
|
-
result
|
|
18
|
+
spinner
|
|
21
19
|
}
|