@devaloop/devalang 0.0.1-alpha.15 → 0.0.1-alpha.16-hotfix.0

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.
Files changed (173) hide show
  1. package/.devalang +2 -0
  2. package/.github/workflows/ci.yml +92 -0
  3. package/Cargo.toml +60 -58
  4. package/README.md +1 -1
  5. package/docs/CHANGELOG.md +34 -1
  6. package/docs/CONTRIBUTING.md +101 -1
  7. package/docs/ROADMAP.md +1 -1
  8. package/docs/TODO.md +1 -1
  9. package/examples/automation.deva +1 -3
  10. package/examples/bank.deva +4 -4
  11. package/examples/events.deva +12 -0
  12. package/examples/function.deva +4 -4
  13. package/examples/index.deva +3 -5
  14. package/examples/loop.deva +5 -11
  15. package/examples/pattern.deva +8 -0
  16. package/examples/plugin.deva +12 -11
  17. package/examples/variables.deva +1 -1
  18. package/out-tsc/bin/index.js +51 -7
  19. package/out-tsc/index.js +3 -1
  20. package/out-tsc/scripts/postbuild.js +9 -10
  21. package/out-tsc/scripts/postinstall.js +49 -0
  22. package/package.json +12 -4
  23. package/project-version.json +3 -3
  24. package/rust/cli/bank.rs +462 -455
  25. package/rust/cli/build.rs +252 -199
  26. package/rust/cli/check.rs +221 -180
  27. package/rust/cli/driver.rs +297 -292
  28. package/rust/cli/generator.rs +1 -0
  29. package/rust/cli/init.rs +87 -79
  30. package/rust/cli/install.rs +35 -32
  31. package/rust/cli/login.rs +127 -134
  32. package/rust/cli/mod.rs +13 -11
  33. package/rust/cli/play.rs +1123 -218
  34. package/rust/cli/telemetry.rs +19 -0
  35. package/rust/cli/template.rs +69 -57
  36. package/rust/cli/update.rs +6 -4
  37. package/rust/common/api.rs +5 -5
  38. package/rust/common/mod.rs +3 -3
  39. package/rust/config/driver.rs +118 -94
  40. package/rust/config/loader.rs +165 -156
  41. package/rust/config/mod.rs +4 -2
  42. package/rust/config/settings.rs +91 -0
  43. package/rust/config/stats.rs +257 -0
  44. package/rust/core/audio/engine.rs +696 -659
  45. package/rust/core/audio/evaluator.rs +263 -132
  46. package/rust/core/audio/interpreter/arrow_call.rs +198 -187
  47. package/rust/core/audio/interpreter/call.rs +98 -95
  48. package/rust/core/audio/interpreter/condition.rs +70 -71
  49. package/rust/core/audio/interpreter/driver.rs +487 -231
  50. package/rust/core/audio/interpreter/function.rs +26 -21
  51. package/rust/core/audio/interpreter/let_.rs +38 -26
  52. package/rust/core/audio/interpreter/load.rs +18 -18
  53. package/rust/core/audio/interpreter/loop_.rs +113 -106
  54. package/rust/core/audio/interpreter/mod.rs +14 -14
  55. package/rust/core/audio/interpreter/sleep.rs +27 -28
  56. package/rust/core/audio/interpreter/spawn.rs +105 -102
  57. package/rust/core/audio/interpreter/tempo.rs +19 -16
  58. package/rust/core/audio/interpreter/trigger.rs +239 -210
  59. package/rust/core/audio/loader/mod.rs +1 -1
  60. package/rust/core/audio/loader/trigger.rs +100 -94
  61. package/rust/core/audio/mod.rs +7 -7
  62. package/rust/core/audio/player.rs +64 -64
  63. package/rust/core/audio/renderer.rs +56 -53
  64. package/rust/core/audio/special/easing.rs +189 -120
  65. package/rust/core/audio/special/env.rs +43 -41
  66. package/rust/core/audio/special/math.rs +102 -92
  67. package/rust/core/audio/special/mod.rs +9 -9
  68. package/rust/core/audio/special/modulator.rs +143 -120
  69. package/rust/core/builder/mod.rs +80 -85
  70. package/rust/core/debugger/lexer.rs +27 -27
  71. package/rust/core/debugger/mod.rs +24 -23
  72. package/rust/core/debugger/module.rs +55 -47
  73. package/rust/core/debugger/preprocessor.rs +27 -27
  74. package/rust/core/debugger/store.rs +40 -39
  75. package/rust/core/error/mod.rs +80 -69
  76. package/rust/core/lexer/handler/arrow.rs +82 -82
  77. package/rust/core/lexer/handler/at.rs +21 -21
  78. package/rust/core/lexer/handler/brace.rs +41 -41
  79. package/rust/core/lexer/handler/colon.rs +21 -21
  80. package/rust/core/lexer/handler/comment.rs +30 -30
  81. package/rust/core/lexer/handler/dot.rs +21 -21
  82. package/rust/core/lexer/handler/driver.rs +337 -292
  83. package/rust/core/lexer/handler/identifier.rs +46 -43
  84. package/rust/core/lexer/handler/indent.rs +66 -66
  85. package/rust/core/lexer/handler/mod.rs +16 -16
  86. package/rust/core/lexer/handler/newline.rs +23 -23
  87. package/rust/core/lexer/handler/number.rs +31 -31
  88. package/rust/core/lexer/handler/operator.rs +46 -46
  89. package/rust/core/lexer/handler/parenthesis.rs +41 -41
  90. package/rust/core/lexer/handler/slash.rs +21 -21
  91. package/rust/core/lexer/handler/string.rs +63 -63
  92. package/rust/core/lexer/mod.rs +54 -51
  93. package/rust/core/lexer/token.rs +97 -94
  94. package/rust/core/mod.rs +11 -11
  95. package/rust/core/parser/driver.rs +513 -490
  96. package/rust/core/parser/handler/arrow_call.rs +233 -227
  97. package/rust/core/parser/handler/at.rs +245 -162
  98. package/rust/core/parser/handler/bank.rs +94 -69
  99. package/rust/core/parser/handler/condition.rs +80 -74
  100. package/rust/core/parser/handler/dot.rs +143 -135
  101. package/rust/core/parser/handler/identifier/automate.rs +257 -194
  102. package/rust/core/parser/handler/identifier/call.rs +91 -88
  103. package/rust/core/parser/handler/identifier/emit.rs +66 -0
  104. package/rust/core/parser/handler/identifier/function.rs +100 -91
  105. package/rust/core/parser/handler/identifier/group.rs +85 -75
  106. package/rust/core/parser/handler/identifier/let_.rs +158 -143
  107. package/rust/core/parser/handler/identifier/mod.rs +54 -56
  108. package/rust/core/parser/handler/identifier/on.rs +98 -0
  109. package/rust/core/parser/handler/identifier/print.rs +52 -29
  110. package/rust/core/parser/handler/identifier/sleep.rs +36 -33
  111. package/rust/core/parser/handler/identifier/spawn.rs +91 -88
  112. package/rust/core/parser/handler/identifier/synth.rs +65 -63
  113. package/rust/core/parser/handler/loop_.rs +170 -89
  114. package/rust/core/parser/handler/mod.rs +8 -8
  115. package/rust/core/parser/handler/tempo.rs +53 -47
  116. package/rust/core/parser/mod.rs +4 -4
  117. package/rust/core/parser/statement.rs +142 -113
  118. package/rust/core/plugin/loader.rs +123 -48
  119. package/rust/core/plugin/mod.rs +2 -1
  120. package/rust/core/plugin/runner.rs +296 -0
  121. package/rust/core/preprocessor/loader.rs +515 -326
  122. package/rust/core/preprocessor/mod.rs +4 -4
  123. package/rust/core/preprocessor/module.rs +60 -58
  124. package/rust/core/preprocessor/processor.rs +99 -101
  125. package/rust/core/preprocessor/resolver/bank.rs +51 -48
  126. package/rust/core/preprocessor/resolver/call.rs +100 -101
  127. package/rust/core/preprocessor/resolver/condition.rs +97 -97
  128. package/rust/core/preprocessor/resolver/driver.rs +310 -280
  129. package/rust/core/preprocessor/resolver/function.rs +69 -68
  130. package/rust/core/preprocessor/resolver/group.rs +96 -91
  131. package/rust/core/preprocessor/resolver/let_.rs +32 -28
  132. package/rust/core/preprocessor/resolver/loop_.rs +320 -121
  133. package/rust/core/preprocessor/resolver/mod.rs +15 -15
  134. package/rust/core/preprocessor/resolver/spawn.rs +76 -73
  135. package/rust/core/preprocessor/resolver/synth.rs +56 -50
  136. package/rust/core/preprocessor/resolver/tempo.rs +50 -49
  137. package/rust/core/preprocessor/resolver/trigger.rs +113 -115
  138. package/rust/core/preprocessor/resolver/value.rs +81 -81
  139. package/rust/core/shared/duration.rs +9 -9
  140. package/rust/core/shared/mod.rs +3 -3
  141. package/rust/core/shared/value.rs +35 -32
  142. package/rust/core/store/function.rs +34 -34
  143. package/rust/core/store/global.rs +55 -38
  144. package/rust/core/store/mod.rs +5 -5
  145. package/rust/core/store/variable.rs +37 -34
  146. package/rust/core/utils/mod.rs +2 -2
  147. package/rust/core/utils/path.rs +37 -31
  148. package/rust/core/utils/validation.rs +35 -36
  149. package/rust/installer/addon.rs +84 -80
  150. package/rust/installer/bank.rs +62 -65
  151. package/rust/installer/mod.rs +5 -5
  152. package/rust/installer/plugin.rs +54 -55
  153. package/rust/installer/utils.rs +56 -56
  154. package/rust/lib.rs +156 -164
  155. package/rust/main.rs +250 -144
  156. package/rust/utils/error.rs +200 -51
  157. package/rust/utils/file.rs +38 -35
  158. package/rust/utils/first_usage.rs +76 -0
  159. package/rust/utils/logger.rs +195 -143
  160. package/rust/utils/mod.rs +9 -7
  161. package/rust/utils/signature.rs +19 -17
  162. package/rust/utils/spinner.rs +22 -19
  163. package/rust/utils/telemetry.rs +292 -0
  164. package/rust/utils/watcher.rs +34 -33
  165. package/templates/minimal/README.md +97 -121
  166. package/templates/welcome/README.md +97 -121
  167. package/typescript/bin/index.ts +19 -5
  168. package/typescript/index.ts +3 -1
  169. package/typescript/scripts/postbuild.ts +10 -6
  170. package/typescript/scripts/postinstall.ts +56 -0
  171. package/typescript/scripts/version/bump.ts +0 -1
  172. package/typescript/scripts/version/index.ts +0 -1
  173. package/out-tsc/bin/devalang.exe +0 -0
@@ -1,32 +1,35 @@
1
- use std::collections::HashMap;
2
- use serde::{ Deserialize, Serialize };
3
-
4
- use crate::core::{parser::statement::{Statement, StatementKind}, shared::duration::Duration};
5
-
6
- #[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
7
- pub enum Value {
8
- Boolean(bool),
9
- Number(f32),
10
- Duration(Duration),
11
- Identifier(String),
12
- String(String),
13
- Array(Vec<Value>),
14
- Map(HashMap<String, Value>),
15
- Block(Vec<Statement>),
16
- Sample(String),
17
- Beat(String),
18
- Statement(Box<Statement>),
19
- StatementKind(Box<StatementKind>),
20
- Unknown,
21
- Null,
22
- }
23
-
24
- impl Value {
25
- pub fn get(&self, key: &str) -> Option<&Value> {
26
- if let Value::Map(map) = self {
27
- map.get(key)
28
- } else {
29
- None
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 std::collections::HashMap;
2
- use crate::core::parser::statement::Statement;
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 std::collections::HashMap;
2
- use crate::core::{
3
- preprocessor::module::Module,
4
- store::{ function::FunctionTable, variable::VariableTable },
5
- };
6
-
7
- #[derive(Debug, Clone)]
8
- pub struct GlobalStore {
9
- pub modules: HashMap<String, Module>,
10
- pub variables: VariableTable,
11
- pub functions: FunctionTable,
12
- }
13
-
14
- impl GlobalStore {
15
- pub fn new() -> Self {
16
- GlobalStore {
17
- modules: HashMap::new(),
18
- functions: FunctionTable::new(),
19
- variables: VariableTable::new(),
20
- }
21
- }
22
-
23
- pub fn insert_module(&mut self, path: String, module: Module) {
24
- self.modules.insert(path, module);
25
- }
26
-
27
- pub fn modules_mut(&mut self) -> &mut HashMap<String, Module> {
28
- &mut self.modules
29
- }
30
-
31
- pub fn get_module(&self, path: &str) -> Option<&Module> {
32
- self.modules.get(path)
33
- }
34
-
35
- pub fn remove_module(&mut self, path: &str) -> Option<Module> {
36
- self.modules.remove(path)
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
+ }
@@ -1,5 +1,5 @@
1
- pub mod global;
2
- pub mod export;
3
- pub mod import;
4
- pub mod variable;
5
- pub mod function;
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 { variables: HashMap::new(), parent: Some(Box::new(parent)) }
25
- }
26
-
27
- pub fn get(&self, name: &str) -> Option<&Value> {
28
- self.variables.get(name)
29
- }
30
-
31
- pub fn remove(&mut self, name: &str) -> Option<Value> {
32
- self.variables.remove(name)
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
+ }
@@ -1,2 +1,2 @@
1
- pub mod path;
2
- pub mod validation;
1
+ pub mod path;
2
+ pub mod validation;
@@ -1,31 +1,37 @@
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.components().collect::<PathBuf>().to_string_lossy().replace('\\', "/")
23
- }
24
-
25
- pub fn resolve_relative_path(base: &str, import: &str) -> String {
26
- let base_path = Path::new(base)
27
- .parent()
28
- .unwrap_or_else(|| Path::new(""));
29
- let full_path = base_path.join(import);
30
- full_path.components().collect::<PathBuf>().to_string_lossy().replace("\\", "/")
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,36 +1,35 @@
1
-
2
- // NOTE: Deprecated functions, kept for reference
3
-
4
- // pub fn is_valid_entity(entity: &str, module: &Module, global_store: &GlobalStore) -> bool {
5
- // let built_ins = ["kick", "snare", "hat", "clap"];
6
-
7
- // if built_ins.contains(&entity) {
8
- // return true;
9
- // }
10
-
11
- // if let Some(val) = module.variable_table.get(entity) {
12
- // match val {
13
- // Value::Sample(_) => true,
14
- // _ => false,
15
- // }
16
- // } else {
17
- // false
18
- // }
19
- // }
20
-
21
- // pub fn is_valid_identifier(ident: &str, module: &Module) -> bool {
22
- // let built_ins = ["auto"];
23
-
24
- // if built_ins.contains(&ident) {
25
- // return true;
26
- // }
27
-
28
- // if let Some(val) = module.variable_table.get(ident) {
29
- // match val {
30
- // Value::Identifier(_) => true,
31
- // _ => false,
32
- // }
33
- // } else {
34
- // false
35
- // }
36
- // }
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
+ // }
@@ -1,80 +1,84 @@
1
- use std::path::Path;
2
- use crate::{
3
- common::{ api::get_api_url },
4
- installer::{ bank::install_bank, plugin::install_plugin },
5
- };
6
- use dirs::home_dir;
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 mut stored_token_path = home_dir().unwrap();
31
- stored_token_path.push(".devalang");
32
- stored_token_path.push("session_token.json");
33
-
34
- let stored_token = std::fs::read_to_string(&stored_token_path).unwrap_or_default();
35
-
36
- let request_url = format!(
37
- "{}/v1/assets/url?type={}&slug={}&token={}",
38
- api_url,
39
- match addon_type {
40
- AddonType::Bank => "bank",
41
- AddonType::Plugin => "plugin",
42
- AddonType::Preset => "preset",
43
- },
44
- slug,
45
- stored_token
46
- );
47
-
48
- let mut headers = reqwest::header::HeaderMap::new();
49
-
50
- headers.insert("Authorization", format!("Bearer {}", stored_token).parse().unwrap());
51
-
52
- let client: reqwest::Client = reqwest::Client
53
- ::builder()
54
- .default_headers(headers)
55
- .build()
56
- .map_err(|_| "Failed to build HTTP client".to_string())?;
57
-
58
- let req = client
59
- .get(&request_url)
60
- .send().await
61
- .map_err(|_| "Failed to receive response".to_string())?;
62
-
63
- let response_body: serde_json::Value = req
64
- .json().await
65
- .map_err(|_| "Failed to read response body".to_string())?;
66
-
67
- let signed_url: String = serde_json
68
- ::from_value(
69
- response_body
70
- .get("payload")
71
- .cloned()
72
- .unwrap_or_default()
73
- .get("url")
74
- .cloned()
75
- .unwrap_or_default()
76
- )
77
- .map_err(|_| "Failed to parse response body".to_string())?;
78
-
79
- Ok(signed_url)
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
+ }