@devaloop/devalang 0.0.1-alpha.14 → 0.0.1-alpha.16
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 +10 -8
- package/.github/workflows/ci.yml +92 -0
- package/Cargo.toml +60 -58
- package/README.md +32 -15
- package/docs/CHANGELOG.md +93 -1
- package/docs/CONTRIBUTING.md +101 -1
- package/docs/ROADMAP.md +2 -2
- package/docs/TODO.md +1 -1
- package/examples/automation.deva +42 -0
- package/examples/bank.deva +4 -4
- package/examples/events.deva +12 -0
- package/examples/function.deva +4 -4
- package/examples/index.deva +39 -25
- package/examples/loop.deva +5 -11
- package/examples/pattern.deva +8 -0
- package/examples/plugin.deva +16 -0
- package/examples/variables.deva +1 -1
- package/out-tsc/bin/index.js +51 -7
- package/out-tsc/index.js +3 -1
- package/out-tsc/scripts/postbuild.js +9 -10
- package/out-tsc/scripts/postinstall.js +49 -0
- package/package.json +12 -4
- package/project-version.json +3 -3
- package/rust/cli/bank.rs +462 -456
- package/rust/cli/build.rs +252 -199
- package/rust/cli/check.rs +221 -180
- package/rust/cli/driver.rs +297 -292
- package/rust/cli/generator.rs +1 -0
- package/rust/cli/init.rs +87 -79
- package/rust/cli/install.rs +35 -32
- package/rust/cli/login.rs +127 -134
- package/rust/cli/mod.rs +13 -11
- package/rust/cli/play.rs +1123 -218
- package/rust/cli/telemetry.rs +19 -0
- package/rust/cli/template.rs +69 -57
- package/rust/cli/update.rs +6 -4
- package/rust/common/api.rs +5 -8
- package/rust/common/cdn.rs +3 -6
- package/rust/common/mod.rs +3 -3
- package/rust/common/sso.rs +3 -6
- package/rust/config/driver.rs +118 -94
- package/rust/config/loader.rs +165 -156
- package/rust/config/mod.rs +4 -2
- package/rust/config/settings.rs +91 -0
- package/rust/config/stats.rs +257 -0
- package/rust/core/audio/engine.rs +696 -518
- package/rust/core/audio/evaluator.rs +263 -31
- package/rust/core/audio/interpreter/arrow_call.rs +198 -161
- package/rust/core/audio/interpreter/automate.rs +18 -0
- package/rust/core/audio/interpreter/call.rs +98 -95
- package/rust/core/audio/interpreter/condition.rs +70 -71
- package/rust/core/audio/interpreter/driver.rs +487 -198
- package/rust/core/audio/interpreter/function.rs +26 -21
- package/rust/core/audio/interpreter/let_.rs +38 -19
- package/rust/core/audio/interpreter/load.rs +18 -18
- package/rust/core/audio/interpreter/loop_.rs +113 -73
- package/rust/core/audio/interpreter/mod.rs +14 -13
- package/rust/core/audio/interpreter/sleep.rs +27 -30
- package/rust/core/audio/interpreter/spawn.rs +105 -102
- package/rust/core/audio/interpreter/tempo.rs +19 -16
- package/rust/core/audio/interpreter/trigger.rs +239 -210
- package/rust/core/audio/loader/mod.rs +1 -1
- package/rust/core/audio/loader/trigger.rs +100 -97
- package/rust/core/audio/mod.rs +7 -6
- package/rust/core/audio/player.rs +64 -64
- package/rust/core/audio/renderer.rs +56 -53
- package/rust/core/audio/special/easing.rs +189 -0
- package/rust/core/audio/special/env.rs +43 -0
- package/rust/core/audio/special/math.rs +102 -0
- package/rust/core/audio/special/mod.rs +9 -0
- package/rust/core/audio/special/modulator.rs +143 -0
- package/rust/core/builder/mod.rs +80 -85
- package/rust/core/debugger/lexer.rs +27 -27
- package/rust/core/debugger/mod.rs +24 -23
- package/rust/core/debugger/module.rs +55 -47
- package/rust/core/debugger/preprocessor.rs +27 -27
- package/rust/core/debugger/store.rs +40 -39
- package/rust/core/error/mod.rs +80 -66
- package/rust/core/lexer/handler/arrow.rs +82 -31
- 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 -263
- package/rust/core/lexer/handler/identifier.rs +46 -42
- package/rust/core/lexer/handler/indent.rs +66 -66
- package/rust/core/lexer/handler/mod.rs +16 -16
- 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 -44
- 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 +54 -51
- package/rust/core/lexer/token.rs +97 -91
- package/rust/core/mod.rs +11 -11
- package/rust/core/parser/driver.rs +513 -408
- package/rust/core/parser/handler/arrow_call.rs +233 -211
- package/rust/core/parser/handler/at.rs +245 -162
- package/rust/core/parser/handler/bank.rs +94 -69
- package/rust/core/parser/handler/condition.rs +80 -74
- package/rust/core/parser/handler/dot.rs +143 -135
- package/rust/core/parser/handler/identifier/automate.rs +257 -0
- package/rust/core/parser/handler/identifier/call.rs +91 -88
- package/rust/core/parser/handler/identifier/emit.rs +66 -0
- package/rust/core/parser/handler/identifier/function.rs +100 -92
- package/rust/core/parser/handler/identifier/group.rs +85 -75
- package/rust/core/parser/handler/identifier/let_.rs +158 -127
- package/rust/core/parser/handler/identifier/mod.rs +54 -52
- package/rust/core/parser/handler/identifier/on.rs +98 -0
- package/rust/core/parser/handler/identifier/print.rs +52 -0
- package/rust/core/parser/handler/identifier/sleep.rs +36 -33
- package/rust/core/parser/handler/identifier/spawn.rs +91 -88
- package/rust/core/parser/handler/identifier/synth.rs +65 -65
- package/rust/core/parser/handler/loop_.rs +170 -72
- package/rust/core/parser/handler/mod.rs +8 -8
- package/rust/core/parser/handler/tempo.rs +53 -47
- package/rust/core/parser/mod.rs +4 -4
- package/rust/core/parser/statement.rs +142 -108
- package/rust/core/plugin/loader.rs +123 -48
- package/rust/core/plugin/mod.rs +2 -1
- package/rust/core/plugin/runner.rs +296 -0
- package/rust/core/preprocessor/loader.rs +515 -326
- package/rust/core/preprocessor/mod.rs +4 -4
- package/rust/core/preprocessor/module.rs +60 -58
- package/rust/core/preprocessor/processor.rs +99 -101
- package/rust/core/preprocessor/resolver/bank.rs +51 -49
- package/rust/core/preprocessor/resolver/call.rs +100 -100
- package/rust/core/preprocessor/resolver/condition.rs +97 -97
- package/rust/core/preprocessor/resolver/driver.rs +310 -278
- package/rust/core/preprocessor/resolver/function.rs +69 -78
- package/rust/core/preprocessor/resolver/group.rs +96 -91
- package/rust/core/preprocessor/resolver/let_.rs +32 -28
- package/rust/core/preprocessor/resolver/loop_.rs +320 -91
- package/rust/core/preprocessor/resolver/mod.rs +15 -15
- package/rust/core/preprocessor/resolver/spawn.rs +76 -92
- package/rust/core/preprocessor/resolver/synth.rs +56 -50
- package/rust/core/preprocessor/resolver/tempo.rs +50 -49
- package/rust/core/preprocessor/resolver/trigger.rs +113 -116
- package/rust/core/preprocessor/resolver/value.rs +81 -87
- package/rust/core/shared/bank.rs +1 -1
- package/rust/core/shared/duration.rs +9 -9
- package/rust/core/shared/mod.rs +3 -3
- package/rust/core/shared/value.rs +35 -32
- package/rust/core/store/function.rs +34 -34
- package/rust/core/store/global.rs +55 -38
- package/rust/core/store/mod.rs +5 -5
- package/rust/core/store/variable.rs +37 -34
- package/rust/core/utils/mod.rs +2 -2
- package/rust/core/utils/path.rs +37 -31
- package/rust/core/utils/validation.rs +35 -37
- package/rust/installer/addon.rs +84 -80
- package/rust/installer/bank.rs +62 -65
- package/rust/installer/mod.rs +5 -5
- package/rust/installer/plugin.rs +54 -55
- package/rust/installer/utils.rs +56 -56
- package/rust/lib.rs +156 -164
- package/rust/main.rs +250 -145
- package/rust/utils/error.rs +200 -0
- package/rust/utils/file.rs +38 -35
- package/rust/utils/first_usage.rs +76 -0
- package/rust/utils/logger.rs +195 -139
- package/rust/utils/mod.rs +9 -50
- package/rust/utils/signature.rs +19 -17
- package/rust/utils/spinner.rs +22 -19
- package/rust/utils/telemetry.rs +292 -0
- package/rust/utils/watcher.rs +34 -33
- package/templates/minimal/README.md +97 -121
- package/templates/welcome/README.md +97 -121
- package/typescript/bin/index.ts +19 -5
- package/typescript/index.ts +3 -1
- package/typescript/scripts/postbuild.ts +10 -6
- package/typescript/scripts/postinstall.ts +56 -0
- package/typescript/scripts/version/bump.ts +0 -1
- package/typescript/scripts/version/index.ts +0 -1
- package/out-tsc/bin/devalang.exe +0 -0
|
@@ -1,32 +1,35 @@
|
|
|
1
|
-
use
|
|
2
|
-
use
|
|
3
|
-
|
|
4
|
-
use crate::core::{
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
1
|
+
use serde::{Deserialize, Serialize};
|
|
2
|
+
use std::collections::HashMap;
|
|
3
|
+
|
|
4
|
+
use crate::core::{
|
|
5
|
+
parser::statement::{Statement, StatementKind},
|
|
6
|
+
shared::duration::Duration,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
|
|
10
|
+
pub enum Value {
|
|
11
|
+
Boolean(bool),
|
|
12
|
+
Number(f32),
|
|
13
|
+
Duration(Duration),
|
|
14
|
+
Identifier(String),
|
|
15
|
+
String(String),
|
|
16
|
+
Array(Vec<Value>),
|
|
17
|
+
Map(HashMap<String, Value>),
|
|
18
|
+
Block(Vec<Statement>),
|
|
19
|
+
Sample(String),
|
|
20
|
+
Beat(String),
|
|
21
|
+
Statement(Box<Statement>),
|
|
22
|
+
StatementKind(Box<StatementKind>),
|
|
23
|
+
Unknown,
|
|
24
|
+
Null,
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
impl Value {
|
|
28
|
+
pub fn get(&self, key: &str) -> Option<&Value> {
|
|
29
|
+
if let Value::Map(map) = self {
|
|
30
|
+
map.get(key)
|
|
31
|
+
} else {
|
|
32
|
+
None
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
use
|
|
2
|
-
use
|
|
3
|
-
|
|
4
|
-
#[derive(Debug, Clone)]
|
|
5
|
-
pub struct FunctionDef {
|
|
6
|
-
pub name: String,
|
|
7
|
-
pub parameters: Vec<String>,
|
|
8
|
-
pub body: Vec<Statement>,
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
#[derive(Debug, Clone)]
|
|
12
|
-
pub struct FunctionTable {
|
|
13
|
-
pub functions: HashMap<String, FunctionDef>,
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
impl FunctionTable {
|
|
17
|
-
pub fn new() -> Self {
|
|
18
|
-
FunctionTable {
|
|
19
|
-
functions: HashMap::new(),
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
pub fn add_function(&mut self, function: FunctionDef) {
|
|
24
|
-
self.functions.insert(function.name.clone(), function);
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
pub fn get_function(&self, name: &str) -> Option<&FunctionDef> {
|
|
28
|
-
self.functions.get(name)
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
pub fn remove_function(&mut self, name: &str) -> Option<FunctionDef> {
|
|
32
|
-
self.functions.remove(name)
|
|
33
|
-
}
|
|
34
|
-
}
|
|
1
|
+
use crate::core::parser::statement::Statement;
|
|
2
|
+
use std::collections::HashMap;
|
|
3
|
+
|
|
4
|
+
#[derive(Debug, Clone)]
|
|
5
|
+
pub struct FunctionDef {
|
|
6
|
+
pub name: String,
|
|
7
|
+
pub parameters: Vec<String>,
|
|
8
|
+
pub body: Vec<Statement>,
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
#[derive(Debug, Clone)]
|
|
12
|
+
pub struct FunctionTable {
|
|
13
|
+
pub functions: HashMap<String, FunctionDef>,
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
impl FunctionTable {
|
|
17
|
+
pub fn new() -> Self {
|
|
18
|
+
FunctionTable {
|
|
19
|
+
functions: HashMap::new(),
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
pub fn add_function(&mut self, function: FunctionDef) {
|
|
24
|
+
self.functions.insert(function.name.clone(), function);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
pub fn get_function(&self, name: &str) -> Option<&FunctionDef> {
|
|
28
|
+
self.functions.get(name)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
pub fn remove_function(&mut self, name: &str) -> Option<FunctionDef> {
|
|
32
|
+
self.functions.remove(name)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -1,38 +1,55 @@
|
|
|
1
|
-
use
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
pub
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
pub
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
1
|
+
use crate::core::{
|
|
2
|
+
parser::statement::Statement,
|
|
3
|
+
plugin::loader::PluginInfo,
|
|
4
|
+
preprocessor::module::Module,
|
|
5
|
+
store::{function::FunctionTable, variable::VariableTable},
|
|
6
|
+
};
|
|
7
|
+
use std::collections::HashMap;
|
|
8
|
+
|
|
9
|
+
#[derive(Debug, Clone)]
|
|
10
|
+
pub struct GlobalStore {
|
|
11
|
+
pub modules: HashMap<String, Module>,
|
|
12
|
+
pub variables: VariableTable,
|
|
13
|
+
pub functions: FunctionTable,
|
|
14
|
+
pub events: HashMap<String, Vec<Statement>>,
|
|
15
|
+
pub plugins: HashMap<String, (PluginInfo, Vec<u8>)>,
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
impl GlobalStore {
|
|
19
|
+
pub fn new() -> Self {
|
|
20
|
+
GlobalStore {
|
|
21
|
+
modules: HashMap::new(),
|
|
22
|
+
functions: FunctionTable::new(),
|
|
23
|
+
variables: VariableTable::new(),
|
|
24
|
+
events: HashMap::new(),
|
|
25
|
+
plugins: HashMap::new(),
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
pub fn insert_module(&mut self, path: String, module: Module) {
|
|
30
|
+
self.modules.insert(path, module);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
pub fn modules_mut(&mut self) -> &mut HashMap<String, Module> {
|
|
34
|
+
&mut self.modules
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
pub fn get_module(&self, path: &str) -> Option<&Module> {
|
|
38
|
+
self.modules.get(path)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
pub fn remove_module(&mut self, path: &str) -> Option<Module> {
|
|
42
|
+
self.modules.remove(path)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
pub fn register_event_handler(&mut self, event: &str, handler: Statement) {
|
|
46
|
+
self.events
|
|
47
|
+
.entry(event.to_string())
|
|
48
|
+
.or_default()
|
|
49
|
+
.push(handler);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
pub fn get_event_handlers(&self, event: &str) -> Option<&Vec<Statement>> {
|
|
53
|
+
self.events.get(event)
|
|
54
|
+
}
|
|
55
|
+
}
|
package/rust/core/store/mod.rs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
pub mod
|
|
2
|
-
pub mod
|
|
3
|
-
pub mod
|
|
4
|
-
pub mod
|
|
5
|
-
pub mod
|
|
1
|
+
pub mod export;
|
|
2
|
+
pub mod function;
|
|
3
|
+
pub mod global;
|
|
4
|
+
pub mod import;
|
|
5
|
+
pub mod variable;
|
|
@@ -1,34 +1,37 @@
|
|
|
1
|
-
use std::collections::HashMap;
|
|
2
|
-
|
|
3
|
-
use crate::core::shared::value::Value;
|
|
4
|
-
|
|
5
|
-
#[derive(Debug, Default, Clone, PartialEq)]
|
|
6
|
-
pub struct VariableTable {
|
|
7
|
-
pub variables: HashMap<String, Value>,
|
|
8
|
-
pub parent: Option<Box<VariableTable>>,
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
impl VariableTable {
|
|
12
|
-
pub fn new() -> Self {
|
|
13
|
-
VariableTable {
|
|
14
|
-
variables: HashMap::new(),
|
|
15
|
-
parent: None,
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
pub fn set(&mut self, name: String, value: Value) {
|
|
20
|
-
self.variables.insert(name, value);
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
pub fn with_parent(parent: VariableTable) -> Self {
|
|
24
|
-
Self {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
1
|
+
use std::collections::HashMap;
|
|
2
|
+
|
|
3
|
+
use crate::core::shared::value::Value;
|
|
4
|
+
|
|
5
|
+
#[derive(Debug, Default, Clone, PartialEq)]
|
|
6
|
+
pub struct VariableTable {
|
|
7
|
+
pub variables: HashMap<String, Value>,
|
|
8
|
+
pub parent: Option<Box<VariableTable>>,
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
impl VariableTable {
|
|
12
|
+
pub fn new() -> Self {
|
|
13
|
+
VariableTable {
|
|
14
|
+
variables: HashMap::new(),
|
|
15
|
+
parent: None,
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
pub fn set(&mut self, name: String, value: Value) {
|
|
20
|
+
self.variables.insert(name, value);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
pub fn with_parent(parent: VariableTable) -> Self {
|
|
24
|
+
Self {
|
|
25
|
+
variables: HashMap::new(),
|
|
26
|
+
parent: Some(Box::new(parent)),
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
pub fn get(&self, name: &str) -> Option<&Value> {
|
|
31
|
+
self.variables.get(name)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
pub fn remove(&mut self, name: &str) -> Option<Value> {
|
|
35
|
+
self.variables.remove(name)
|
|
36
|
+
}
|
|
37
|
+
}
|
package/rust/core/utils/mod.rs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
pub mod path;
|
|
2
|
-
pub mod validation;
|
|
1
|
+
pub mod path;
|
|
2
|
+
pub mod validation;
|
package/rust/core/utils/path.rs
CHANGED
|
@@ -1,31 +1,37 @@
|
|
|
1
|
-
use std::path::{
|
|
2
|
-
|
|
3
|
-
pub fn find_entry_file(entry: &str) -> Option<String> {
|
|
4
|
-
let path = Path::new(entry);
|
|
5
|
-
|
|
6
|
-
if path.is_file() {
|
|
7
|
-
return Some(normalize_path(entry));
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
if path.is_dir() {
|
|
11
|
-
let candidate = path.join("index.deva");
|
|
12
|
-
if candidate.exists() {
|
|
13
|
-
return Some(normalize_path(&candidate));
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
None
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
pub fn normalize_path<P: AsRef<Path>>(path: P) -> String {
|
|
21
|
-
let path_buf = PathBuf::from(path.as_ref());
|
|
22
|
-
path_buf
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
1
|
+
use std::path::{Path, PathBuf};
|
|
2
|
+
|
|
3
|
+
pub fn find_entry_file(entry: &str) -> Option<String> {
|
|
4
|
+
let path = Path::new(entry);
|
|
5
|
+
|
|
6
|
+
if path.is_file() {
|
|
7
|
+
return Some(normalize_path(entry));
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
if path.is_dir() {
|
|
11
|
+
let candidate = path.join("index.deva");
|
|
12
|
+
if candidate.exists() {
|
|
13
|
+
return Some(normalize_path(&candidate));
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
None
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
pub fn normalize_path<P: AsRef<Path>>(path: P) -> String {
|
|
21
|
+
let path_buf = PathBuf::from(path.as_ref());
|
|
22
|
+
path_buf
|
|
23
|
+
.components()
|
|
24
|
+
.collect::<PathBuf>()
|
|
25
|
+
.to_string_lossy()
|
|
26
|
+
.replace('\\', "/")
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
pub fn resolve_relative_path(base: &str, import: &str) -> String {
|
|
30
|
+
let base_path = Path::new(base).parent().unwrap_or_else(|| Path::new(""));
|
|
31
|
+
let full_path = base_path.join(import);
|
|
32
|
+
full_path
|
|
33
|
+
.components()
|
|
34
|
+
.collect::<PathBuf>()
|
|
35
|
+
.to_string_lossy()
|
|
36
|
+
.replace("\\", "/")
|
|
37
|
+
}
|
|
@@ -1,37 +1,35 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
//
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
//
|
|
7
|
-
|
|
8
|
-
//
|
|
9
|
-
|
|
10
|
-
//
|
|
11
|
-
|
|
12
|
-
//
|
|
13
|
-
//
|
|
14
|
-
//
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
// }
|
|
18
|
-
//
|
|
19
|
-
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
//
|
|
24
|
-
|
|
25
|
-
//
|
|
26
|
-
|
|
27
|
-
//
|
|
28
|
-
|
|
29
|
-
//
|
|
30
|
-
//
|
|
31
|
-
//
|
|
32
|
-
//
|
|
33
|
-
//
|
|
34
|
-
// }
|
|
35
|
-
//
|
|
36
|
-
// }
|
|
37
|
-
// }
|
|
1
|
+
// NOTE: Deprecated functions, kept for reference
|
|
2
|
+
|
|
3
|
+
// pub fn is_valid_entity(entity: &str, module: &Module, global_store: &GlobalStore) -> bool {
|
|
4
|
+
// let built_ins = ["kick", "snare", "hat", "clap"];
|
|
5
|
+
|
|
6
|
+
// if built_ins.contains(&entity) {
|
|
7
|
+
// return true;
|
|
8
|
+
// }
|
|
9
|
+
|
|
10
|
+
// if let Some(val) = module.variable_table.get(entity) {
|
|
11
|
+
// match val {
|
|
12
|
+
// Value::Sample(_) => true,
|
|
13
|
+
// _ => false,
|
|
14
|
+
// }
|
|
15
|
+
// } else {
|
|
16
|
+
// false
|
|
17
|
+
// }
|
|
18
|
+
// }
|
|
19
|
+
|
|
20
|
+
// pub fn is_valid_identifier(ident: &str, module: &Module) -> bool {
|
|
21
|
+
// let built_ins = ["auto"];
|
|
22
|
+
|
|
23
|
+
// if built_ins.contains(&ident) {
|
|
24
|
+
// return true;
|
|
25
|
+
// }
|
|
26
|
+
|
|
27
|
+
// if let Some(val) = module.variable_table.get(ident) {
|
|
28
|
+
// match val {
|
|
29
|
+
// Value::Identifier(_) => true,
|
|
30
|
+
// _ => false,
|
|
31
|
+
// }
|
|
32
|
+
// } else {
|
|
33
|
+
// false
|
|
34
|
+
// }
|
|
35
|
+
// }
|
package/rust/installer/addon.rs
CHANGED
|
@@ -1,80 +1,84 @@
|
|
|
1
|
-
use
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
installer::{
|
|
5
|
-
};
|
|
6
|
-
use
|
|
7
|
-
|
|
8
|
-
#[derive(Debug, Clone)]
|
|
9
|
-
pub enum AddonType {
|
|
10
|
-
Bank,
|
|
11
|
-
Plugin,
|
|
12
|
-
Preset,
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
pub async fn install_addon(
|
|
16
|
-
addon_type: AddonType,
|
|
17
|
-
name: &str,
|
|
18
|
-
target_dir: &Path
|
|
19
|
-
) -> Result<(), String> {
|
|
20
|
-
match addon_type {
|
|
21
|
-
AddonType::Bank => install_bank(name, target_dir).await,
|
|
22
|
-
AddonType::Plugin => install_plugin(name, target_dir).await,
|
|
23
|
-
AddonType::Preset => Err("Preset installation not implemented".into()),
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
pub async fn ask_api_for_signed_url(addon_type: AddonType, slug: &str) -> Result<String, String> {
|
|
28
|
-
let api_url = get_api_url();
|
|
29
|
-
|
|
30
|
-
let
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
AddonType::
|
|
42
|
-
AddonType::
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
.
|
|
65
|
-
.map_err(|_| "Failed to
|
|
66
|
-
|
|
67
|
-
let
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
1
|
+
use crate::{
|
|
2
|
+
common::api::get_api_url,
|
|
3
|
+
config::settings::get_user_config,
|
|
4
|
+
installer::{bank::install_bank, plugin::install_plugin},
|
|
5
|
+
};
|
|
6
|
+
use std::path::Path;
|
|
7
|
+
|
|
8
|
+
#[derive(Debug, Clone)]
|
|
9
|
+
pub enum AddonType {
|
|
10
|
+
Bank,
|
|
11
|
+
Plugin,
|
|
12
|
+
Preset,
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
pub async fn install_addon(
|
|
16
|
+
addon_type: AddonType,
|
|
17
|
+
name: &str,
|
|
18
|
+
target_dir: &Path,
|
|
19
|
+
) -> Result<(), String> {
|
|
20
|
+
match addon_type {
|
|
21
|
+
AddonType::Bank => install_bank(name, target_dir).await,
|
|
22
|
+
AddonType::Plugin => install_plugin(name, target_dir).await,
|
|
23
|
+
AddonType::Preset => Err("Preset installation not implemented".into()),
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
pub async fn ask_api_for_signed_url(addon_type: AddonType, slug: &str) -> Result<String, String> {
|
|
28
|
+
let api_url = get_api_url();
|
|
29
|
+
|
|
30
|
+
let user_config = get_user_config();
|
|
31
|
+
if user_config.is_none() {
|
|
32
|
+
return Err("User is not logged in".into());
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
let stored_token = user_config.unwrap().session.clone();
|
|
36
|
+
|
|
37
|
+
let request_url = format!(
|
|
38
|
+
"{}/v1/assets/url?type={}&slug={}&token={}",
|
|
39
|
+
api_url,
|
|
40
|
+
match addon_type {
|
|
41
|
+
AddonType::Bank => "bank",
|
|
42
|
+
AddonType::Plugin => "plugin",
|
|
43
|
+
AddonType::Preset => "preset",
|
|
44
|
+
},
|
|
45
|
+
slug,
|
|
46
|
+
stored_token
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
let mut headers = reqwest::header::HeaderMap::new();
|
|
50
|
+
|
|
51
|
+
headers.insert(
|
|
52
|
+
"Authorization",
|
|
53
|
+
format!("Bearer {}", stored_token).parse().unwrap(),
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
let client: reqwest::Client = reqwest::Client::builder()
|
|
57
|
+
.default_headers(headers)
|
|
58
|
+
.build()
|
|
59
|
+
.map_err(|_| "Failed to build HTTP client".to_string())?;
|
|
60
|
+
|
|
61
|
+
let req = client
|
|
62
|
+
.get(&request_url)
|
|
63
|
+
.send()
|
|
64
|
+
.await
|
|
65
|
+
.map_err(|_| "Failed to receive response".to_string())?;
|
|
66
|
+
|
|
67
|
+
let response_body: serde_json::Value = req
|
|
68
|
+
.json()
|
|
69
|
+
.await
|
|
70
|
+
.map_err(|_| "Failed to read response body".to_string())?;
|
|
71
|
+
|
|
72
|
+
let signed_url: String = serde_json::from_value(
|
|
73
|
+
response_body
|
|
74
|
+
.get("payload")
|
|
75
|
+
.cloned()
|
|
76
|
+
.unwrap_or_default()
|
|
77
|
+
.get("url")
|
|
78
|
+
.cloned()
|
|
79
|
+
.unwrap_or_default(),
|
|
80
|
+
)
|
|
81
|
+
.map_err(|_| "Failed to parse response body".to_string())?;
|
|
82
|
+
|
|
83
|
+
Ok(signed_url)
|
|
84
|
+
}
|