@devaloop/devalang 0.0.1-alpha.16-hotfix.1 → 0.0.1-alpha.17

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 (235) hide show
  1. package/.cargo/config.toml +2 -0
  2. package/.devalang +6 -10
  3. package/.github/workflows/ci.yml +19 -8
  4. package/Cargo.toml +18 -2
  5. package/README.md +80 -33
  6. package/docs/CHANGELOG.md +56 -0
  7. package/docs/ROADMAP.md +6 -3
  8. package/examples/index.deva +52 -35
  9. package/out-tsc/bin/index.d.ts +2 -0
  10. package/out-tsc/core/functions/index.d.ts +37 -0
  11. package/out-tsc/core/functions/index.js +76 -0
  12. package/out-tsc/core/index.d.ts +6 -0
  13. package/out-tsc/core/index.js +22 -0
  14. package/out-tsc/core/types/index.d.ts +4 -0
  15. package/out-tsc/core/types/index.js +20 -0
  16. package/out-tsc/core/types/plugin.d.ts +18 -0
  17. package/out-tsc/core/types/plugin.js +2 -0
  18. package/out-tsc/core/types/result.d.ts +27 -0
  19. package/out-tsc/core/types/result.js +2 -0
  20. package/out-tsc/core/types/statement.d.ts +106 -0
  21. package/out-tsc/core/types/statement.js +2 -0
  22. package/out-tsc/core/types/value.d.ts +43 -0
  23. package/out-tsc/core/types/value.js +2 -0
  24. package/out-tsc/index.d.ts +7 -0
  25. package/out-tsc/index.js +41 -2
  26. package/out-tsc/pkg/devalang_core.d.ts +7 -0
  27. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +33 -0
  28. package/out-tsc/scripts/copy-wasm-dts.d.ts +1 -0
  29. package/out-tsc/scripts/copy-wasm-dts.js +73 -0
  30. package/out-tsc/scripts/postinstall.d.ts +1 -0
  31. package/out-tsc/scripts/postinstall.js +33 -23
  32. package/out-tsc/scripts/version/bump.d.ts +1 -0
  33. package/out-tsc/scripts/version/fetch.d.ts +1 -0
  34. package/out-tsc/scripts/version/index.d.ts +1 -0
  35. package/out-tsc/scripts/version/sync.d.ts +1 -0
  36. package/package.json +16 -4
  37. package/project-version.json +3 -3
  38. package/rust/cli/bank/api.rs +122 -0
  39. package/rust/cli/bank/commands.rs +275 -0
  40. package/rust/cli/bank/mod.rs +29 -0
  41. package/rust/cli/build/commands.rs +97 -0
  42. package/rust/cli/build/mod.rs +2 -0
  43. package/rust/cli/build/process.rs +146 -0
  44. package/rust/cli/{check.rs → check/mod.rs} +18 -31
  45. package/rust/cli/discover/commands.rs +253 -0
  46. package/rust/cli/discover/config.rs +111 -0
  47. package/rust/cli/discover/fs.rs +19 -0
  48. package/rust/cli/discover/install.rs +103 -0
  49. package/rust/cli/discover/metadata.rs +48 -0
  50. package/rust/cli/discover/mod.rs +5 -0
  51. package/rust/cli/{init.rs → init/commands.rs} +88 -87
  52. package/rust/cli/init/mod.rs +1 -0
  53. package/rust/{installer → cli/install}/addon.rs +5 -9
  54. package/rust/cli/install/bank.rs +53 -0
  55. package/rust/cli/{install.rs → install/commands.rs} +9 -9
  56. package/rust/{installer → cli/install}/mod.rs +2 -3
  57. package/rust/cli/install/plugin.rs +61 -0
  58. package/rust/cli/{login.rs → login/commands.rs} +8 -11
  59. package/rust/cli/login/mod.rs +1 -0
  60. package/rust/cli/mod.rs +2 -3
  61. package/rust/cli/{driver.rs → parser.rs} +19 -2
  62. package/rust/cli/play/commands.rs +324 -0
  63. package/rust/cli/play/io.rs +17 -0
  64. package/rust/cli/play/mod.rs +5 -0
  65. package/rust/cli/play/process.rs +150 -0
  66. package/rust/cli/play/realtime.rs +91 -0
  67. package/rust/cli/play/utils.rs +23 -0
  68. package/rust/cli/telemetry/commands.rs +22 -0
  69. package/rust/cli/telemetry/event_creator.rs +80 -0
  70. package/rust/cli/telemetry/mod.rs +3 -0
  71. package/rust/cli/telemetry/send.rs +51 -0
  72. package/rust/cli/{template.rs → template/commands.rs} +1 -1
  73. package/rust/cli/template/mod.rs +1 -0
  74. package/rust/cli/{update.rs → update/commands.rs} +6 -6
  75. package/rust/cli/update/mod.rs +1 -0
  76. package/rust/config/driver.rs +57 -72
  77. package/rust/config/mod.rs +1 -2
  78. package/rust/config/ops.rs +26 -0
  79. package/rust/config/settings.rs +60 -50
  80. package/rust/core/audio/engine/helpers.rs +146 -0
  81. package/rust/core/audio/engine/mod.rs +7 -0
  82. package/rust/core/audio/engine/sample.rs +298 -0
  83. package/rust/core/audio/engine/synth.rs +310 -0
  84. package/rust/core/audio/evaluator.rs +15 -12
  85. package/rust/core/audio/interpreter/arrow_call.rs +99 -24
  86. package/rust/core/audio/interpreter/call.rs +81 -60
  87. package/rust/core/audio/interpreter/condition.rs +3 -2
  88. package/rust/core/audio/interpreter/driver.rs +206 -151
  89. package/rust/core/audio/interpreter/let_.rs +1 -1
  90. package/rust/core/audio/interpreter/load.rs +2 -1
  91. package/rust/core/audio/interpreter/loop_.rs +7 -6
  92. package/rust/core/audio/interpreter/sleep.rs +2 -1
  93. package/rust/core/audio/interpreter/spawn.rs +45 -57
  94. package/rust/core/audio/interpreter/tempo.rs +31 -10
  95. package/rust/core/audio/interpreter/trigger.rs +2 -2
  96. package/rust/core/audio/loader/trigger.rs +4 -7
  97. package/rust/core/audio/player.rs +6 -0
  98. package/rust/core/audio/renderer.rs +5 -7
  99. package/rust/core/audio/special/env.rs +3 -1
  100. package/rust/core/audio/special/math.rs +4 -4
  101. package/rust/core/audio/special/modulator.rs +2 -2
  102. package/rust/core/builder/mod.rs +9 -3
  103. package/rust/core/debugger/lexer.rs +1 -1
  104. package/rust/core/debugger/mod.rs +6 -0
  105. package/rust/core/debugger/module.rs +4 -4
  106. package/rust/core/debugger/preprocessor.rs +1 -1
  107. package/rust/core/debugger/store.rs +2 -2
  108. package/rust/core/error/mod.rs +189 -0
  109. package/rust/core/lexer/handler/arrow.rs +1 -1
  110. package/rust/core/lexer/handler/at.rs +1 -1
  111. package/rust/core/lexer/handler/brace.rs +2 -2
  112. package/rust/core/lexer/handler/colon.rs +1 -1
  113. package/rust/core/lexer/handler/comment.rs +1 -1
  114. package/rust/core/lexer/handler/dot.rs +1 -1
  115. package/rust/core/lexer/handler/driver.rs +1 -1
  116. package/rust/core/lexer/handler/identifier.rs +1 -1
  117. package/rust/core/lexer/handler/mod.rs +1 -2
  118. package/rust/core/lexer/handler/number.rs +1 -1
  119. package/rust/core/lexer/handler/operator.rs +1 -1
  120. package/rust/core/lexer/handler/parenthesis.rs +2 -2
  121. package/rust/core/lexer/handler/slash.rs +1 -1
  122. package/rust/core/lexer/handler/string.rs +1 -1
  123. package/rust/core/lexer/mod.rs +22 -12
  124. package/rust/core/lexer/token.rs +90 -97
  125. package/rust/core/mod.rs +0 -1
  126. package/rust/core/parser/driver.rs +66 -13
  127. package/rust/core/parser/handler/arrow_call.rs +28 -8
  128. package/rust/core/parser/handler/at.rs +55 -21
  129. package/rust/core/parser/handler/bank.rs +14 -4
  130. package/rust/core/parser/handler/condition.rs +6 -3
  131. package/rust/core/parser/handler/dot.rs +2 -1
  132. package/rust/core/parser/handler/identifier/automate.rs +13 -16
  133. package/rust/core/parser/handler/identifier/call.rs +4 -4
  134. package/rust/core/parser/handler/identifier/emit.rs +9 -5
  135. package/rust/core/parser/handler/identifier/function.rs +20 -7
  136. package/rust/core/parser/handler/identifier/group.rs +11 -7
  137. package/rust/core/parser/handler/identifier/let_.rs +24 -9
  138. package/rust/core/parser/handler/identifier/mod.rs +6 -5
  139. package/rust/core/parser/handler/identifier/on.rs +16 -7
  140. package/rust/core/parser/handler/identifier/print.rs +6 -9
  141. package/rust/core/parser/handler/identifier/sleep.rs +12 -5
  142. package/rust/core/parser/handler/identifier/spawn.rs +4 -4
  143. package/rust/core/parser/handler/identifier/synth.rs +79 -9
  144. package/rust/core/parser/handler/loop_.rs +39 -14
  145. package/rust/core/parser/handler/tempo.rs +9 -5
  146. package/rust/core/parser/mod.rs +0 -1
  147. package/rust/core/parser/statement.rs +6 -137
  148. package/rust/core/plugin/loader.rs +41 -27
  149. package/rust/core/plugin/runner.rs +68 -17
  150. package/rust/core/preprocessor/loader.rs +155 -33
  151. package/rust/core/preprocessor/processor.rs +2 -2
  152. package/rust/core/preprocessor/resolver/bank.rs +6 -8
  153. package/rust/core/preprocessor/resolver/call.rs +20 -24
  154. package/rust/core/preprocessor/resolver/condition.rs +6 -8
  155. package/rust/core/preprocessor/resolver/driver.rs +14 -16
  156. package/rust/core/preprocessor/resolver/function.rs +6 -6
  157. package/rust/core/preprocessor/resolver/group.rs +6 -8
  158. package/rust/core/preprocessor/resolver/loop_.rs +8 -10
  159. package/rust/core/preprocessor/resolver/spawn.rs +19 -23
  160. package/rust/core/preprocessor/resolver/synth.rs +6 -8
  161. package/rust/core/preprocessor/resolver/tempo.rs +6 -8
  162. package/rust/core/preprocessor/resolver/trigger.rs +22 -19
  163. package/rust/core/preprocessor/resolver/value.rs +99 -4
  164. package/rust/core/store/export.rs +28 -28
  165. package/rust/core/store/function.rs +6 -0
  166. package/rust/core/store/global.rs +7 -1
  167. package/rust/core/store/import.rs +28 -28
  168. package/rust/core/store/variable.rs +1 -1
  169. package/rust/core/utils/mod.rs +0 -1
  170. package/rust/lib.rs +102 -9
  171. package/rust/main.rs +156 -45
  172. package/rust/types/Cargo.toml +8 -0
  173. package/rust/types/src/addons.rs +55 -0
  174. package/rust/types/src/ast.rs +198 -0
  175. package/rust/types/src/config.rs +74 -0
  176. package/rust/types/src/lib.rs +12 -0
  177. package/rust/types/src/telemetry.rs +85 -0
  178. package/rust/utils/Cargo.toml +23 -0
  179. package/rust/utils/{error.rs → src/error.rs} +186 -200
  180. package/rust/utils/src/file.rs +94 -0
  181. package/rust/utils/src/first_usage.rs +97 -0
  182. package/rust/utils/{mod.rs → src/lib.rs} +1 -1
  183. package/rust/utils/{logger.rs → src/logger.rs} +17 -12
  184. package/rust/utils/src/path.rs +88 -0
  185. package/rust/utils/src/signature.rs +41 -0
  186. package/rust/utils/{spinner.rs → src/spinner.rs} +3 -5
  187. package/rust/utils/src/version.rs +27 -0
  188. package/rust/utils/{watcher.rs → src/watcher.rs} +13 -1
  189. package/rust/web/api.rs +5 -0
  190. package/rust/web/cdn.rs +34 -0
  191. package/templates/minimal/README.md +98 -54
  192. package/templates/welcome/README.md +98 -54
  193. package/templates/welcome/src/index.deva +56 -8
  194. package/templates/welcome/src/variables.deva +2 -4
  195. package/tests/rust/TODO.md +0 -0
  196. package/tests/typescript/index.spec.ts +136 -0
  197. package/tests/typescript/playhead.spec.ts +36 -0
  198. package/tests/typescript/render_e2e.spec.ts +77 -0
  199. package/tsconfig.json +1 -1
  200. package/typescript/core/functions/index.ts +83 -0
  201. package/typescript/core/index.ts +6 -0
  202. package/typescript/core/types/index.ts +4 -0
  203. package/typescript/core/types/plugin.ts +19 -0
  204. package/typescript/core/types/result.ts +29 -0
  205. package/typescript/core/types/statement.ts +47 -0
  206. package/typescript/core/types/value.ts +29 -0
  207. package/typescript/index.ts +7 -2
  208. package/typescript/pkg/devalang_core.d.ts +4 -0
  209. package/typescript/scripts/copy-wasm-dts.ts +41 -0
  210. package/typescript/scripts/postinstall.ts +45 -32
  211. package/rust/cli/bank.rs +0 -462
  212. package/rust/cli/build.rs +0 -252
  213. package/rust/cli/generator.rs +0 -1
  214. package/rust/cli/play.rs +0 -1123
  215. package/rust/cli/telemetry.rs +0 -19
  216. package/rust/common/api.rs +0 -5
  217. package/rust/common/cdn.rs +0 -5
  218. package/rust/config/loader.rs +0 -165
  219. package/rust/config/stats.rs +0 -257
  220. package/rust/core/audio/engine.rs +0 -696
  221. package/rust/core/shared/bank.rs +0 -21
  222. package/rust/core/shared/duration.rs +0 -9
  223. package/rust/core/shared/mod.rs +0 -3
  224. package/rust/core/shared/value.rs +0 -35
  225. package/rust/core/utils/validation.rs +0 -35
  226. package/rust/installer/bank.rs +0 -62
  227. package/rust/installer/plugin.rs +0 -54
  228. package/rust/installer/utils.rs +0 -56
  229. package/rust/utils/file.rs +0 -38
  230. package/rust/utils/first_usage.rs +0 -76
  231. package/rust/utils/signature.rs +0 -19
  232. package/rust/utils/telemetry.rs +0 -292
  233. package/rust/utils/version.rs +0 -15
  234. /package/rust/{common → web}/mod.rs +0 -0
  235. /package/rust/{common → web}/sso.rs +0 -0
@@ -1,21 +0,0 @@
1
- use serde::Deserialize;
2
-
3
- #[derive(Debug, Deserialize)]
4
- pub struct BankInfo {
5
- pub name: String,
6
- pub version: String,
7
- pub description: String,
8
- pub author: String,
9
- }
10
-
11
- #[derive(Debug, Deserialize)]
12
- pub struct BankFile {
13
- pub bank: BankInfo,
14
- pub triggers: Option<Vec<BankTrigger>>,
15
- }
16
-
17
- #[derive(Debug, Deserialize)]
18
- pub struct BankTrigger {
19
- pub name: String,
20
- pub path: String,
21
- }
@@ -1,9 +0,0 @@
1
- use serde::{Deserialize, Serialize};
2
-
3
- #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
4
- pub enum Duration {
5
- Number(f32),
6
- Identifier(String),
7
- Beat(String),
8
- Auto,
9
- }
@@ -1,3 +0,0 @@
1
- pub mod bank;
2
- pub mod duration;
3
- pub mod value;
@@ -1,35 +0,0 @@
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,35 +0,0 @@
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,62 +0,0 @@
1
- use crate::{
2
- config::loader::{add_bank_to_config, load_config},
3
- installer::{
4
- addon::{AddonType, ask_api_for_signed_url},
5
- utils::{download_file, extract_archive},
6
- },
7
- utils::logger::{LogLevel, Logger},
8
- };
9
- use std::path::{Path, PathBuf};
10
-
11
- pub async fn install_bank(name: &str, target_dir: &Path) -> Result<(), String> {
12
- let logger = Logger::new();
13
-
14
- let signed_url = ask_api_for_signed_url(AddonType::Bank, name).await?;
15
-
16
- let bank_dir = target_dir.join("bank");
17
- let archive_path = PathBuf::from(format!("./.deva/tmp/{}.devabank", name));
18
- let extract_path = bank_dir.join(name);
19
-
20
- download_file(&signed_url, &archive_path)
21
- .await
22
- .map_err(|e| format!("Failed to download: {}", e))?;
23
-
24
- if extract_path.exists() {
25
- logger.log_message(
26
- LogLevel::Warning,
27
- &format!(
28
- "Bank '{}' already exists at '{}'. Skipping install.",
29
- name,
30
- extract_path.display()
31
- ),
32
- );
33
-
34
- return Ok(());
35
- }
36
-
37
- // Add the bank to the config
38
- let root_dir = target_dir
39
- .parent()
40
- .ok_or_else(|| "Failed to determine root directory".to_string())?;
41
-
42
- let config_path = root_dir.join(".devalang");
43
- if !config_path.exists() {
44
- return Err(format!(
45
- "Config file not found at '{}'. Please run 'devalang init' before adding an addon",
46
- config_path.display()
47
- ));
48
- }
49
-
50
- let mut config = load_config(Some(&config_path))
51
- .ok_or_else(|| format!("Failed to load config from '{}'", config_path.display()))?;
52
-
53
- let dependency_path = &format!("devalang://bank/{}", name);
54
-
55
- extract_archive(&archive_path, &extract_path)
56
- .await
57
- .map_err(|e| format!("Failed to extract: {}", e))?;
58
-
59
- add_bank_to_config(&mut config, &extract_path, dependency_path);
60
-
61
- Ok(())
62
- }
@@ -1,54 +0,0 @@
1
- use crate::{
2
- common::cdn::get_cdn_url,
3
- config::loader::{add_plugin_to_config, load_config},
4
- installer::utils::{download_file, extract_archive},
5
- };
6
- use std::path::{Path, PathBuf};
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)
26
- .await
27
- .map_err(|e| format!("Failed to download: {}", e))?;
28
-
29
- extract_archive(&archive_path, &extract_path)
30
- .await
31
- .map_err(|e| format!("Failed to extract: {}", e))?;
32
-
33
- // Add the plugin to the config
34
- let root_dir = target_dir
35
- .parent()
36
- .ok_or_else(|| "Failed to determine root directory".to_string())?;
37
-
38
- let config_path = root_dir.join(".devalang");
39
- if !config_path.exists() {
40
- return Err(format!(
41
- "Config file not found at '{}'. Please run 'devalang init' before adding an addon",
42
- config_path.display()
43
- ));
44
- }
45
-
46
- let mut config = load_config(Some(&config_path))
47
- .ok_or_else(|| format!("Failed to load config from '{}'", config_path.display()))?;
48
-
49
- let dependency_path = &format!("devalang://plugin/{}", name);
50
-
51
- add_plugin_to_config(&mut config, &extract_path, dependency_path);
52
-
53
- Ok(())
54
- }
@@ -1,56 +0,0 @@
1
- use std::error::Error;
2
- use std::fs::File;
3
- use std::io::BufReader;
4
- use std::io::{Cursor, copy};
5
- use std::path::Path;
6
- use zip::ZipArchive;
7
-
8
- pub async fn download_file(url: &str, destination: &Path) -> Result<(), Box<dyn Error>> {
9
- let response = reqwest::get(url).await?;
10
-
11
- if !response.status().is_success() {
12
- return Err(format!("Failed to download file: HTTP {}", response.status()).into());
13
- }
14
-
15
- if let Some(parent) = destination.parent() {
16
- std::fs::create_dir_all(parent)?;
17
- }
18
-
19
- let bytes = response.bytes().await?;
20
- let mut content = Cursor::new(bytes);
21
- let mut file = File::create(destination)?;
22
- copy(&mut content, &mut file)?;
23
-
24
- Ok(())
25
- }
26
-
27
- pub async fn extract_archive(
28
- zip_path: &Path,
29
- destination: &Path,
30
- ) -> Result<(), Box<dyn std::error::Error>> {
31
- let file = File::open(zip_path)?;
32
- let mut archive = ZipArchive::new(BufReader::new(file))?;
33
-
34
- for i in 0..archive.len() {
35
- let mut file = archive.by_index(i)?;
36
- let outpath = destination.join(file.mangled_name());
37
-
38
- if file.name().ends_with('/') {
39
- std::fs::create_dir_all(&outpath)?;
40
- } else {
41
- if let Some(p) = outpath.parent() {
42
- std::fs::create_dir_all(p)?;
43
- }
44
-
45
- let mut outfile = File::create(&outpath)?;
46
- std::io::copy(&mut file, &mut outfile)?;
47
- }
48
- }
49
-
50
- // Clear the temporary folder after extraction
51
- if zip_path.exists() {
52
- std::fs::remove_file(zip_path)?;
53
- }
54
-
55
- Ok(())
56
- }
@@ -1,38 +0,0 @@
1
- use include_dir::{Dir, DirEntry};
2
- use std::{
3
- fs::{self},
4
- path::Path,
5
- };
6
-
7
- pub fn copy_dir_recursive(dir: &Dir, target_root: &Path, base_path: &Path) {
8
- for entry in dir.entries() {
9
- match entry {
10
- DirEntry::Dir(subdir) => {
11
- copy_dir_recursive(subdir, target_root, base_path);
12
- }
13
- DirEntry::File(file) => {
14
- let rel_path = file.path().strip_prefix(base_path).unwrap();
15
- let dest_path = target_root.join(rel_path);
16
-
17
- if let Some(parent) = dest_path.parent() {
18
- fs::create_dir_all(parent).unwrap();
19
- }
20
-
21
- fs::write(&dest_path, file.contents()).expect("Error writing file");
22
- }
23
- }
24
- }
25
- }
26
-
27
- pub fn format_file_size(bytes: u64) -> String {
28
- const KB: u64 = 1024;
29
- const MB: u64 = 1024 * 1024;
30
-
31
- if bytes >= MB {
32
- format!("{:.2} Mb", (bytes as f64) / (MB as f64))
33
- } else if bytes >= KB {
34
- format!("{:.2} Kb", (bytes as f64) / (KB as f64))
35
- } else {
36
- format!("{} bytes", bytes)
37
- }
38
- }
@@ -1,76 +0,0 @@
1
- use crossterm::style::{Attribute, SetAttribute};
2
- use std::fmt::Write;
3
-
4
- use crate::{
5
- config::settings::{get_devalang_homedir, set_user_config_bool, write_user_config_file},
6
- utils::signature::get_signature,
7
- };
8
-
9
- pub fn check_is_first_usage() {
10
- if get_devalang_homedir()
11
- .join("config.json")
12
- .try_exists()
13
- .is_ok()
14
- {
15
- // Do nothing
16
- } else {
17
- first_usage_welcome();
18
- write_user_config_file();
19
- }
20
- }
21
-
22
- pub fn first_usage_welcome() {
23
- let version = env!("CARGO_PKG_VERSION");
24
- print!("{}", get_signature(version));
25
-
26
- let mut s = String::new();
27
- let welcome_msg = format!(
28
- "Welcome to Devalang ! \n\
29
- It looks like this is your first time using the tool.\n\
30
- A configuration file will be created in your home directory.\n\
31
- ({})",
32
- get_devalang_homedir().display()
33
- );
34
-
35
- write!(&mut s, "{}", SetAttribute(Attribute::Bold)).unwrap();
36
- write!(&mut s, "{}", welcome_msg).unwrap();
37
- write!(&mut s, "{}", SetAttribute(Attribute::Reset)).unwrap();
38
-
39
- println!("");
40
- println!("{}", s);
41
- println!("");
42
-
43
- first_usage_ask_for_telemetry();
44
- }
45
-
46
- pub fn first_usage_ask_for_telemetry() {
47
- let telemetry_msg = "Would you like to enable anonymous telemetry ?";
48
- let telemetry_desc = "This data helps us improve the tool. You can opt-out at any time.";
49
-
50
- let telemetry_prompt = inquire::Confirm::new(telemetry_msg)
51
- .with_help_message(telemetry_desc)
52
- .with_default(false)
53
- .prompt();
54
-
55
- let telemetry_response = telemetry_prompt.unwrap_or(false);
56
-
57
- write_user_config_file();
58
-
59
- if telemetry_response == true {
60
- println!("");
61
- println!(
62
- "Telemetry enabled. You can opt-out at any time by using 'devalang telemetry disable'"
63
- );
64
- println!("");
65
-
66
- set_user_config_bool("telemetry", true);
67
- } else {
68
- println!("");
69
- println!(
70
- "Telemetry disabled. You can enable it at any time by using 'devalang telemetry enable'"
71
- );
72
- println!("");
73
-
74
- set_user_config_bool("telemetry", false);
75
- }
76
- }
@@ -1,19 +0,0 @@
1
- pub fn get_signature(version: &str) -> String {
2
- let signature = format!(
3
- r#"
4
- /|_/|
5
- / ^ ^(_o 🦊 Devalang
6
- / __.'
7
- / \ A programming language for music and sound.
8
- / _ \_ Part of the Devaloop project.
9
- (_) (_) '._
10
- '.__ '. .-''-'. https://devalang.com
11
- ( '. ('.____.''
12
- _) )'_, ) v{}
13
- (__/ (__/
14
- "#,
15
- version
16
- );
17
-
18
- signature
19
- }