@devaloop/devalang 0.0.1-beta.1 → 0.0.1-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.devalang +9 -10
- package/Cargo.toml +5 -4
- package/README.md +7 -5
- package/docs/CHANGELOG.md +42 -0
- package/docs/ROADMAP.md +5 -1
- package/docs/TODO.md +3 -14
- package/examples/bus.deva +10 -0
- package/examples/effect.deva +2 -0
- package/examples/filter.deva +11 -0
- package/examples/lfo.deva +9 -0
- package/examples/synth.deva +11 -1
- package/examples/synth_types.deva +17 -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 +8 -7
- package/package.json +1 -1
- package/project-version.json +3 -3
- package/rust/cli/bank/api.rs +122 -122
- package/rust/cli/bank/commands.rs +33 -2
- package/rust/cli/bank/mod.rs +29 -29
- package/rust/cli/build/commands.rs +53 -3
- package/rust/cli/build/mod.rs +2 -2
- package/rust/cli/build/process.rs +26 -7
- package/rust/cli/check/mod.rs +2 -2
- package/rust/cli/discover/commands.rs +253 -253
- package/rust/cli/discover/config.rs +111 -111
- package/rust/cli/discover/fs.rs +19 -19
- package/rust/cli/discover/install.rs +103 -103
- package/rust/cli/discover/metadata.rs +48 -48
- package/rust/cli/discover/mod.rs +5 -5
- package/rust/cli/install/addon.rs +118 -118
- package/rust/cli/install/bank.rs +22 -3
- package/rust/cli/install/commands.rs +35 -35
- package/rust/cli/install/mod.rs +4 -4
- package/rust/cli/install/plugin.rs +80 -61
- package/rust/cli/login/commands.rs +124 -124
- package/rust/cli/mod.rs +12 -12
- package/rust/cli/parser.rs +46 -1
- package/rust/cli/play/commands.rs +71 -20
- package/rust/cli/play/mod.rs +5 -5
- package/rust/cli/play/process.rs +14 -5
- 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 +220 -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 +51 -2
- package/rust/core/audio/engine/notes/dsp.rs +85 -0
- package/rust/core/audio/engine/notes/mod.rs +44 -0
- package/rust/core/audio/engine/notes/params.rs +294 -0
- package/rust/core/audio/engine/sample/insert.rs +199 -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} +1 -159
- 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 +55 -23
- package/rust/core/audio/interpreter/mod.rs +1 -13
- package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +175 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +384 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +2 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +316 -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} +16 -18
- package/rust/core/audio/interpreter/{call.rs → statements/call.rs} +5 -4
- package/rust/core/audio/interpreter/{condition.rs → statements/condition.rs} +2 -1
- package/rust/core/audio/interpreter/{function.rs → statements/function.rs} +2 -4
- package/rust/core/audio/interpreter/{let_.rs → statements/let_.rs} +2 -4
- package/rust/core/audio/interpreter/{load.rs → statements/load.rs} +2 -4
- package/rust/core/audio/interpreter/{loop_.rs → statements/loop_.rs} +2 -1
- 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} +3 -2
- package/rust/core/audio/interpreter/{tempo.rs → statements/tempo.rs} +40 -40
- package/rust/core/audio/interpreter/{trigger.rs → statements/trigger.rs} +1 -1
- package/rust/core/audio/loader/trigger.rs +2 -1
- package/rust/core/audio/mod.rs +6 -7
- package/rust/core/audio/player.rs +70 -70
- 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/mod.rs +9 -9
- package/rust/core/audio/special/modulator.rs +143 -143
- package/rust/core/builder/mod.rs +45 -2
- package/rust/core/debugger/lexer.rs +27 -27
- package/rust/core/debugger/{module.rs → logs.rs} +3 -6
- package/rust/core/debugger/mod.rs +30 -30
- package/rust/core/debugger/preprocessor.rs +27 -27
- package/rust/core/debugger/store.rs +2 -4
- package/rust/core/error/mod.rs +269 -269
- package/rust/core/lexer/driver.rs +59 -61
- package/rust/core/lexer/handler/arrow.rs +82 -82
- package/rust/core/lexer/handler/at.rs +21 -21
- package/rust/core/lexer/handler/brace.rs +41 -41
- package/rust/core/lexer/handler/colon.rs +21 -21
- package/rust/core/lexer/handler/comment.rs +30 -30
- package/rust/core/lexer/handler/dot.rs +21 -21
- package/rust/core/lexer/handler/driver.rs +337 -337
- package/rust/core/lexer/handler/identifier.rs +47 -47
- package/rust/core/lexer/handler/indent.rs +66 -66
- package/rust/core/lexer/handler/mod.rs +15 -15
- package/rust/core/lexer/handler/newline.rs +23 -23
- package/rust/core/lexer/handler/number.rs +31 -31
- package/rust/core/lexer/handler/operator.rs +46 -46
- package/rust/core/lexer/handler/parenthesis.rs +41 -41
- package/rust/core/lexer/handler/slash.rs +21 -21
- package/rust/core/lexer/handler/string.rs +63 -63
- package/rust/core/lexer/mod.rs +3 -3
- package/rust/core/mod.rs +0 -1
- 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 +139 -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 +223 -0
- package/rust/core/parser/driver/parser.rs +160 -0
- package/rust/core/parser/handler/arrow_call.rs +28 -4
- 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 +135 -135
- package/rust/core/parser/handler/loop_.rs +194 -194
- package/rust/core/parser/handler/mod.rs +9 -9
- package/rust/core/parser/handler/pattern.rs +1 -1
- package/rust/core/parser/handler/tempo.rs +105 -57
- package/rust/core/parser/statement.rs +10 -11
- package/rust/core/plugin/loader.rs +1 -1
- package/rust/core/plugin/mod.rs +2 -2
- package/rust/core/plugin/runner/mod.rs +11 -0
- package/rust/core/plugin/{runner.rs → runner/non_wasm.rs} +297 -347
- package/rust/core/plugin/runner/wasm32.rs +43 -0
- package/rust/core/preprocessor/loader/inject.rs +278 -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 +2 -7
- package/rust/core/preprocessor/{processor.rs → processor/handlers.rs} +6 -13
- package/rust/core/preprocessor/processor/mod.rs +1 -0
- package/rust/core/preprocessor/resolver/bank.rs +49 -49
- package/rust/core/preprocessor/resolver/call.rs +124 -124
- package/rust/core/preprocessor/resolver/condition.rs +95 -95
- package/rust/core/preprocessor/resolver/driver.rs +324 -324
- package/rust/core/preprocessor/resolver/function.rs +2 -2
- package/rust/core/preprocessor/resolver/group.rs +46 -18
- package/rust/core/preprocessor/resolver/let_.rs +32 -32
- package/rust/core/preprocessor/resolver/loop_.rs +318 -318
- package/rust/core/preprocessor/resolver/mod.rs +16 -16
- package/rust/core/preprocessor/resolver/pattern.rs +83 -83
- package/rust/core/preprocessor/resolver/spawn.rs +99 -99
- package/rust/core/preprocessor/resolver/synth.rs +54 -54
- package/rust/core/preprocessor/resolver/tempo.rs +48 -48
- package/rust/core/preprocessor/resolver/trigger.rs +116 -116
- package/rust/core/preprocessor/resolver/value.rs +176 -176
- package/rust/core/store/global.rs +2 -6
- package/rust/core/store/mod.rs +1 -5
- package/rust/lib.rs +18 -3
- package/rust/main.rs +27 -3
- package/rust/types/Cargo.toml +1 -1
- package/rust/types/src/addons.rs +55 -55
- package/rust/types/src/config.rs +84 -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 +2 -2
- package/rust/utils/src/file.rs +94 -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 +129 -88
- package/rust/utils/src/signature.rs +41 -41
- package/rust/utils/src/spinner.rs +20 -20
- package/rust/utils/src/version.rs +27 -27
- package/rust/utils/src/watcher.rs +46 -46
- package/rust/web/api.rs +5 -5
- package/rust/web/cdn.rs +34 -34
- package/rust/web/mod.rs +3 -3
- package/tests/integration.rs +21 -21
- package/typescript/core/functions/index.ts +11 -0
- package/typescript/pkg/devalang_core.ts +20 -4
- 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
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
#[cfg(feature = "cli")]
|
|
2
|
-
pub fn get_signature(version: &str) -> String {
|
|
3
|
-
let signature = format!(
|
|
4
|
-
r#"
|
|
5
|
-
/|_/|
|
|
6
|
-
/ ^ ^(_o 🦊 Devalang
|
|
7
|
-
/ __.'
|
|
8
|
-
/ \ A programming language for music and sound.
|
|
9
|
-
/ _ \_ Part of the Devaloop project.
|
|
10
|
-
(_) (_) '._
|
|
11
|
-
'.__ '. .-''-'. https://devalang.com
|
|
12
|
-
( '. ('.____.''
|
|
13
|
-
_) )'_, ) v{}
|
|
14
|
-
(__/ (__/
|
|
15
|
-
"#,
|
|
16
|
-
version
|
|
17
|
-
);
|
|
18
|
-
|
|
19
|
-
signature
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
#[cfg(not(feature = "cli"))]
|
|
23
|
-
pub fn get_signature(version: &str) -> String {
|
|
24
|
-
let signature = format!(
|
|
25
|
-
r#"
|
|
26
|
-
/|_/|
|
|
27
|
-
/ ^ ^(_o 🦊 Devalang
|
|
28
|
-
/ __.'
|
|
29
|
-
/ \ A programming language for music and sound.
|
|
30
|
-
/ _ \_ Part of the Devaloop project.
|
|
31
|
-
(_) (_) '._
|
|
32
|
-
'.__ '. .-''-'. https://devalang.com
|
|
33
|
-
( '. ('.____.''
|
|
34
|
-
_) )'_, ) v{}
|
|
35
|
-
(__/ (__/
|
|
36
|
-
"#,
|
|
37
|
-
version
|
|
38
|
-
);
|
|
39
|
-
|
|
40
|
-
signature
|
|
41
|
-
}
|
|
1
|
+
#[cfg(feature = "cli")]
|
|
2
|
+
pub fn get_signature(version: &str) -> String {
|
|
3
|
+
let signature = format!(
|
|
4
|
+
r#"
|
|
5
|
+
/|_/|
|
|
6
|
+
/ ^ ^(_o 🦊 Devalang
|
|
7
|
+
/ __.'
|
|
8
|
+
/ \ A programming language for music and sound.
|
|
9
|
+
/ _ \_ Part of the Devaloop project.
|
|
10
|
+
(_) (_) '._
|
|
11
|
+
'.__ '. .-''-'. https://devalang.com
|
|
12
|
+
( '. ('.____.''
|
|
13
|
+
_) )'_, ) v{}
|
|
14
|
+
(__/ (__/
|
|
15
|
+
"#,
|
|
16
|
+
version
|
|
17
|
+
);
|
|
18
|
+
|
|
19
|
+
signature
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
#[cfg(not(feature = "cli"))]
|
|
23
|
+
pub fn get_signature(version: &str) -> String {
|
|
24
|
+
let signature = format!(
|
|
25
|
+
r#"
|
|
26
|
+
/|_/|
|
|
27
|
+
/ ^ ^(_o 🦊 Devalang
|
|
28
|
+
/ __.'
|
|
29
|
+
/ \ A programming language for music and sound.
|
|
30
|
+
/ _ \_ Part of the Devaloop project.
|
|
31
|
+
(_) (_) '._
|
|
32
|
+
'.__ '. .-''-'. https://devalang.com
|
|
33
|
+
( '. ('.____.''
|
|
34
|
+
_) )'_, ) v{}
|
|
35
|
+
(__/ (__/
|
|
36
|
+
"#,
|
|
37
|
+
version
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
signature
|
|
41
|
+
}
|
|
@@ -1,20 +1,20 @@
|
|
|
1
|
-
#[cfg(feature = "cli")]
|
|
2
|
-
use indicatif::{ProgressBar, ProgressStyle};
|
|
3
|
-
#[cfg(feature = "cli")]
|
|
4
|
-
use std::time::Duration;
|
|
5
|
-
|
|
6
|
-
#[cfg(feature = "cli")]
|
|
7
|
-
pub fn start_spinner(start_msg: &str) -> ProgressBar {
|
|
8
|
-
let spinner = ProgressBar::new_spinner();
|
|
9
|
-
spinner.set_style(
|
|
10
|
-
ProgressStyle::with_template("{spinner:.green} {msg}")
|
|
11
|
-
.unwrap()
|
|
12
|
-
.tick_strings(&["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]),
|
|
13
|
-
);
|
|
14
|
-
spinner.set_message(start_msg.to_string());
|
|
15
|
-
spinner.enable_steady_tick(Duration::from_millis(80));
|
|
16
|
-
|
|
17
|
-
std::thread::sleep(Duration::from_millis(750));
|
|
18
|
-
|
|
19
|
-
spinner
|
|
20
|
-
}
|
|
1
|
+
#[cfg(feature = "cli")]
|
|
2
|
+
use indicatif::{ProgressBar, ProgressStyle};
|
|
3
|
+
#[cfg(feature = "cli")]
|
|
4
|
+
use std::time::Duration;
|
|
5
|
+
|
|
6
|
+
#[cfg(feature = "cli")]
|
|
7
|
+
pub fn start_spinner(start_msg: &str) -> ProgressBar {
|
|
8
|
+
let spinner = ProgressBar::new_spinner();
|
|
9
|
+
spinner.set_style(
|
|
10
|
+
ProgressStyle::with_template("{spinner:.green} {msg}")
|
|
11
|
+
.unwrap()
|
|
12
|
+
.tick_strings(&["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]),
|
|
13
|
+
);
|
|
14
|
+
spinner.set_message(start_msg.to_string());
|
|
15
|
+
spinner.enable_steady_tick(Duration::from_millis(80));
|
|
16
|
+
|
|
17
|
+
std::thread::sleep(Duration::from_millis(750));
|
|
18
|
+
|
|
19
|
+
spinner
|
|
20
|
+
}
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
use crate::{path::get_package_root, signature::get_signature};
|
|
2
|
-
|
|
3
|
-
pub fn get_version() -> String {
|
|
4
|
-
if let Some(root) = get_package_root() {
|
|
5
|
-
let project_version_json = root.join("
|
|
6
|
-
if let Ok(version) = std::fs::read_to_string(project_version_json) {
|
|
7
|
-
if let Ok(parsed) = serde_json::from_str::<serde_json::Value>(&version) {
|
|
8
|
-
if let Some(version_val) = parsed.get("version") {
|
|
9
|
-
if let Some(s) = version_val.as_str() {
|
|
10
|
-
return s.to_string();
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
"0.0.0".to_string()
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
pub fn get_version_with_signature() -> String {
|
|
21
|
-
let version = get_version();
|
|
22
|
-
let signature = get_signature(&version);
|
|
23
|
-
|
|
24
|
-
println!("{}", signature);
|
|
25
|
-
|
|
26
|
-
"(c) 2025 Devaloop. All rights reserved.".to_string()
|
|
27
|
-
}
|
|
1
|
+
use crate::{ path::get_package_root, signature::get_signature };
|
|
2
|
+
|
|
3
|
+
pub fn get_version() -> String {
|
|
4
|
+
if let Some(root) = get_package_root() {
|
|
5
|
+
let project_version_json = root.join("package.json");
|
|
6
|
+
if let Ok(version) = std::fs::read_to_string(project_version_json) {
|
|
7
|
+
if let Ok(parsed) = serde_json::from_str::<serde_json::Value>(&version) {
|
|
8
|
+
if let Some(version_val) = parsed.get("version") {
|
|
9
|
+
if let Some(s) = version_val.as_str() {
|
|
10
|
+
return s.to_string();
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
"0.0.0".to_string()
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
pub fn get_version_with_signature() -> String {
|
|
21
|
+
let version = get_version();
|
|
22
|
+
let signature = get_signature(&version);
|
|
23
|
+
|
|
24
|
+
println!("{}", signature);
|
|
25
|
+
|
|
26
|
+
"(c) 2025 Devaloop. All rights reserved.".to_string()
|
|
27
|
+
}
|
|
@@ -1,46 +1,46 @@
|
|
|
1
|
-
use notify::{Config, RecommendedWatcher, RecursiveMode, Watcher};
|
|
2
|
-
use std::sync::mpsc::channel;
|
|
3
|
-
|
|
4
|
-
use std::time::{Duration, Instant};
|
|
5
|
-
|
|
6
|
-
pub fn watch_directory<F>(entry: String, callback: F) -> notify::Result<()>
|
|
7
|
-
where
|
|
8
|
-
F: Fn() + Send + 'static,
|
|
9
|
-
{
|
|
10
|
-
let (tx, rx) = channel();
|
|
11
|
-
|
|
12
|
-
let mut watcher: RecommendedWatcher = Watcher::new(tx, Config::default())?;
|
|
13
|
-
watcher.watch(&entry.as_ref(), RecursiveMode::Recursive)?;
|
|
14
|
-
|
|
15
|
-
let mut last_trigger = Instant::now();
|
|
16
|
-
|
|
17
|
-
loop {
|
|
18
|
-
match rx.recv() {
|
|
19
|
-
Ok(_) => {
|
|
20
|
-
let now = Instant::now();
|
|
21
|
-
if now.duration_since(last_trigger) > Duration::from_millis(200) {
|
|
22
|
-
callback();
|
|
23
|
-
last_trigger = now;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
Err(e) => {
|
|
27
|
-
// Prefer structured logging when available
|
|
28
|
-
#[cfg(feature = "cli")]
|
|
29
|
-
{
|
|
30
|
-
let logger = crate::logger::Logger::new();
|
|
31
|
-
logger.log_message(
|
|
32
|
-
crate::logger::LogLevel::Error,
|
|
33
|
-
&format!("Channel error: {:?}", e),
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
#[cfg(not(feature = "cli"))]
|
|
37
|
-
{
|
|
38
|
-
eprintln!("Channel error: {:?}", e);
|
|
39
|
-
}
|
|
40
|
-
break;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
Ok(())
|
|
46
|
-
}
|
|
1
|
+
use notify::{Config, RecommendedWatcher, RecursiveMode, Watcher};
|
|
2
|
+
use std::sync::mpsc::channel;
|
|
3
|
+
|
|
4
|
+
use std::time::{Duration, Instant};
|
|
5
|
+
|
|
6
|
+
pub fn watch_directory<F>(entry: String, callback: F) -> notify::Result<()>
|
|
7
|
+
where
|
|
8
|
+
F: Fn() + Send + 'static,
|
|
9
|
+
{
|
|
10
|
+
let (tx, rx) = channel();
|
|
11
|
+
|
|
12
|
+
let mut watcher: RecommendedWatcher = Watcher::new(tx, Config::default())?;
|
|
13
|
+
watcher.watch(&entry.as_ref(), RecursiveMode::Recursive)?;
|
|
14
|
+
|
|
15
|
+
let mut last_trigger = Instant::now();
|
|
16
|
+
|
|
17
|
+
loop {
|
|
18
|
+
match rx.recv() {
|
|
19
|
+
Ok(_) => {
|
|
20
|
+
let now = Instant::now();
|
|
21
|
+
if now.duration_since(last_trigger) > Duration::from_millis(200) {
|
|
22
|
+
callback();
|
|
23
|
+
last_trigger = now;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
Err(e) => {
|
|
27
|
+
// Prefer structured logging when available
|
|
28
|
+
#[cfg(feature = "cli")]
|
|
29
|
+
{
|
|
30
|
+
let logger = crate::logger::Logger::new();
|
|
31
|
+
logger.log_message(
|
|
32
|
+
crate::logger::LogLevel::Error,
|
|
33
|
+
&format!("Channel error: {:?}", e),
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
#[cfg(not(feature = "cli"))]
|
|
37
|
+
{
|
|
38
|
+
eprintln!("Channel error: {:?}", e);
|
|
39
|
+
}
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
Ok(())
|
|
46
|
+
}
|
package/rust/web/api.rs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
pub fn get_api_url() -> String {
|
|
2
|
-
let api_url = "https://api.devalang.com";
|
|
3
|
-
// let api_url = "http://127.0.0.1:8989";
|
|
4
|
-
api_url.to_string()
|
|
5
|
-
}
|
|
1
|
+
pub fn get_api_url() -> String {
|
|
2
|
+
let api_url = "https://api.devalang.com";
|
|
3
|
+
// let api_url = "http://127.0.0.1:8989";
|
|
4
|
+
api_url.to_string()
|
|
5
|
+
}
|
package/rust/web/cdn.rs
CHANGED
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
use std::error::Error;
|
|
2
|
-
use std::fs::File;
|
|
3
|
-
use std::io::{Cursor, copy};
|
|
4
|
-
use std::path::Path;
|
|
5
|
-
|
|
6
|
-
pub fn get_cdn_url() -> String {
|
|
7
|
-
let cdn_url = "https://cdn.devalang.com";
|
|
8
|
-
// let cdn_url = "http://127.0.0.1:8888";
|
|
9
|
-
cdn_url.to_string()
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
pub async fn download_from_cdn(url: &str, destination: &Path) -> Result<(), Box<dyn Error>> {
|
|
13
|
-
if !url.starts_with(&get_cdn_url()) {
|
|
14
|
-
return Err(format!("Invalid CDN URL: {}", url).into());
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
let response = reqwest::get(url).await?;
|
|
18
|
-
|
|
19
|
-
if !response.status().is_success() {
|
|
20
|
-
return Err(format!("Failed to download file: HTTP {}", response.status()).into());
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
if let Some(parent) = destination.parent() {
|
|
24
|
-
std::fs::create_dir_all(parent)?;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
let bytes = response.bytes().await?;
|
|
28
|
-
let mut content = Cursor::new(bytes);
|
|
29
|
-
let mut file = File::create(destination)?;
|
|
30
|
-
|
|
31
|
-
copy(&mut content, &mut file)?;
|
|
32
|
-
|
|
33
|
-
Ok(())
|
|
34
|
-
}
|
|
1
|
+
use std::error::Error;
|
|
2
|
+
use std::fs::File;
|
|
3
|
+
use std::io::{Cursor, copy};
|
|
4
|
+
use std::path::Path;
|
|
5
|
+
|
|
6
|
+
pub fn get_cdn_url() -> String {
|
|
7
|
+
let cdn_url = "https://cdn.devalang.com";
|
|
8
|
+
// let cdn_url = "http://127.0.0.1:8888";
|
|
9
|
+
cdn_url.to_string()
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
pub async fn download_from_cdn(url: &str, destination: &Path) -> Result<(), Box<dyn Error>> {
|
|
13
|
+
if !url.starts_with(&get_cdn_url()) {
|
|
14
|
+
return Err(format!("Invalid CDN URL: {}", url).into());
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
let response = reqwest::get(url).await?;
|
|
18
|
+
|
|
19
|
+
if !response.status().is_success() {
|
|
20
|
+
return Err(format!("Failed to download file: HTTP {}", response.status()).into());
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
if let Some(parent) = destination.parent() {
|
|
24
|
+
std::fs::create_dir_all(parent)?;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let bytes = response.bytes().await?;
|
|
28
|
+
let mut content = Cursor::new(bytes);
|
|
29
|
+
let mut file = File::create(destination)?;
|
|
30
|
+
|
|
31
|
+
copy(&mut content, &mut file)?;
|
|
32
|
+
|
|
33
|
+
Ok(())
|
|
34
|
+
}
|
package/rust/web/mod.rs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
pub mod api;
|
|
2
|
-
pub mod cdn;
|
|
3
|
-
pub mod sso;
|
|
1
|
+
pub mod api;
|
|
2
|
+
pub mod cdn;
|
|
3
|
+
pub mod sso;
|
package/tests/integration.rs
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
// Aggregator test: include tests from tests/rust/* as distinct modules.
|
|
2
|
-
// This keeps sources organized while providing a single integration test
|
|
3
|
-
// file that Cargo will compile and run.
|
|
4
|
-
|
|
5
|
-
mod rust_tests {
|
|
6
|
-
pub mod cli_help {
|
|
7
|
-
include!("rust/cli_help.rs");
|
|
8
|
-
}
|
|
9
|
-
pub mod cli_version {
|
|
10
|
-
include!("rust/cli_version.rs");
|
|
11
|
-
}
|
|
12
|
-
pub mod cli_template_list {
|
|
13
|
-
include!("rust/cli_template_list.rs");
|
|
14
|
-
}
|
|
15
|
-
pub mod cli_check_build {
|
|
16
|
-
include!("rust/cli_check_build.rs");
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Re-export tests so the test runner finds them at crate root.
|
|
21
|
-
pub use rust_tests::*;
|
|
1
|
+
// Aggregator test: include tests from tests/rust/* as distinct modules.
|
|
2
|
+
// This keeps sources organized while providing a single integration test
|
|
3
|
+
// file that Cargo will compile and run.
|
|
4
|
+
|
|
5
|
+
mod rust_tests {
|
|
6
|
+
pub mod cli_help {
|
|
7
|
+
include!("rust/cli_help.rs");
|
|
8
|
+
}
|
|
9
|
+
pub mod cli_version {
|
|
10
|
+
include!("rust/cli_version.rs");
|
|
11
|
+
}
|
|
12
|
+
pub mod cli_template_list {
|
|
13
|
+
include!("rust/cli_template_list.rs");
|
|
14
|
+
}
|
|
15
|
+
pub mod cli_check_build {
|
|
16
|
+
include!("rust/cli_check_build.rs");
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Re-export tests so the test runner finds them at crate root.
|
|
21
|
+
pub use rust_tests::*;
|
|
@@ -71,6 +71,17 @@ export function register_playhead_callback(cb: (ev: { time: number; line: number
|
|
|
71
71
|
return;
|
|
72
72
|
}
|
|
73
73
|
|
|
74
|
+
/**
|
|
75
|
+
* Collects playhead events that have been recorded during playback.
|
|
76
|
+
* @returns Array of playhead events { time, line, column }.
|
|
77
|
+
*/
|
|
78
|
+
export function collect_playhead_events() {
|
|
79
|
+
if (wasmPkg && typeof wasmPkg.collect_playhead_events === "function") {
|
|
80
|
+
return wasmPkg.collect_playhead_events();
|
|
81
|
+
}
|
|
82
|
+
return [];
|
|
83
|
+
}
|
|
84
|
+
|
|
74
85
|
/**
|
|
75
86
|
* Unregisters the JS callback for playhead events.
|
|
76
87
|
* @returns void
|
|
@@ -10,8 +10,7 @@ try {
|
|
|
10
10
|
// (this keeps tests and consumers robust).
|
|
11
11
|
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
12
12
|
runtimePkg = require("../../pkg/devalang_core");
|
|
13
|
-
}
|
|
14
|
-
catch (e) {
|
|
13
|
+
} catch (e) {
|
|
15
14
|
runtimePkg = undefined;
|
|
16
15
|
}
|
|
17
16
|
|
|
@@ -39,11 +38,28 @@ export function register_playhead_callback(cb?: any) {
|
|
|
39
38
|
return;
|
|
40
39
|
}
|
|
41
40
|
|
|
41
|
+
export function collect_playhead_events() {
|
|
42
|
+
if (runtimePkg && typeof runtimePkg.collect_playhead_events === "function") {
|
|
43
|
+
return runtimePkg.collect_playhead_events();
|
|
44
|
+
}
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
|
|
42
48
|
export function unregister_playhead_callback() {
|
|
43
|
-
if (
|
|
49
|
+
if (
|
|
50
|
+
runtimePkg &&
|
|
51
|
+
typeof runtimePkg.unregister_playhead_callback === "function"
|
|
52
|
+
)
|
|
44
53
|
return runtimePkg.unregister_playhead_callback();
|
|
45
54
|
return;
|
|
46
55
|
}
|
|
47
56
|
|
|
48
|
-
const pkg = {
|
|
57
|
+
const pkg = {
|
|
58
|
+
parse,
|
|
59
|
+
debug_render,
|
|
60
|
+
render_audio,
|
|
61
|
+
register_playhead_callback,
|
|
62
|
+
collect_playhead_events,
|
|
63
|
+
unregister_playhead_callback,
|
|
64
|
+
};
|
|
49
65
|
export default pkg;
|