@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,35 +1,38 @@
1
- use std::{ fs::{ self }, path::Path };
2
- use include_dir::{ Dir, DirEntry };
3
-
4
- pub fn copy_dir_recursive(dir: &Dir, target_root: &Path, base_path: &Path) {
5
- for entry in dir.entries() {
6
- match entry {
7
- DirEntry::Dir(subdir) => {
8
- copy_dir_recursive(subdir, target_root, base_path);
9
- }
10
- DirEntry::File(file) => {
11
- let rel_path = file.path().strip_prefix(base_path).unwrap();
12
- let dest_path = target_root.join(rel_path);
13
-
14
- if let Some(parent) = dest_path.parent() {
15
- fs::create_dir_all(parent).unwrap();
16
- }
17
-
18
- fs::write(&dest_path, file.contents()).expect("Error writing file");
19
- }
20
- }
21
- }
22
- }
23
-
24
- pub fn format_file_size(bytes: u64) -> String {
25
- const KB: u64 = 1024;
26
- const MB: u64 = 1024 * 1024;
27
-
28
- if bytes >= MB {
29
- format!("{:.2} Mb", (bytes as f64) / (MB as f64))
30
- } else if bytes >= KB {
31
- format!("{:.2} Kb", (bytes as f64) / (KB as f64))
32
- } else {
33
- format!("{} bytes", bytes)
34
- }
35
- }
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
+ }
@@ -0,0 +1,76 @@
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,143 +1,195 @@
1
- #[cfg(feature = "cli")]
2
- use crossterm::style::{Attribute, Color, ResetColor, SetAttribute, SetForegroundColor};
3
- use std::fmt::Write;
4
-
5
- #[derive(Debug, Clone, PartialEq)]
6
- pub enum LogLevel {
7
- Success,
8
- Error,
9
- Info,
10
- Print,
11
- Warning,
12
- Watcher,
13
- Debug,
14
- }
15
-
16
- #[derive(Debug, Clone)]
17
- pub struct Logger;
18
-
19
- impl Logger {
20
- pub fn new() -> Self {
21
- Logger
22
- }
23
-
24
- // --- log_message ---
25
-
26
- #[cfg(feature = "cli")]
27
- pub fn log_message(&self, level: LogLevel, message: &str) {
28
- let formatted_status = self.format_status(level);
29
- println!("🦊 {} {} {}", self.language_signature(), formatted_status, message);
30
- }
31
-
32
- #[cfg(not(feature = "cli"))]
33
- pub fn log_message(&self, _level: LogLevel, _message: &str) {
34
- // no-op for WASM
35
- }
36
-
37
- // --- log_message_with_trace ---
38
-
39
- #[cfg(feature = "cli")]
40
- pub fn log_message_with_trace(&self, level: LogLevel, message: &str, trace: Vec<&str>) {
41
- let formatted_status = self.format_status(level);
42
- println!("🦊 {} {} {}", self.language_signature(), formatted_status, message);
43
- for t in trace {
44
- println!(" ↳ {}", t);
45
- }
46
- }
47
-
48
- #[cfg(not(feature = "cli"))]
49
- pub fn log_message_with_trace(&self, _level: LogLevel, _message: &str, _trace: Vec<&str>) {
50
- // no-op for WASM
51
- }
52
-
53
- // --- log_error_with_stacktrace ---
54
-
55
- #[cfg(feature = "cli")]
56
- pub fn log_error_with_stacktrace(&self, message: &str, stacktrace: &str) {
57
- let formatted_status = self.format_status(LogLevel::Error);
58
- println!("🦊 {} {} {}", self.language_signature(), formatted_status, message);
59
- println!(" ↳ {}", stacktrace);
60
- }
61
-
62
- #[cfg(not(feature = "cli"))]
63
- pub fn log_error_with_stacktrace(&self, _message: &str, _stacktrace: &str) {
64
- // no-op for WASM
65
- }
66
-
67
- // --- language_signature ---
68
-
69
- #[cfg(feature = "cli")]
70
- fn language_signature(&self) -> String {
71
- let mut s = String::new();
72
-
73
- write!(&mut s, "{}", SetForegroundColor(Color::Grey)).unwrap();
74
- s.push('[');
75
-
76
- write!(&mut s, "{}", SetForegroundColor(Color::Rgb { r: 29, g: 211, b: 176 })).unwrap();
77
- write!(&mut s, "{}", SetAttribute(Attribute::Bold)).unwrap();
78
- s.push_str("Devalang");
79
- write!(&mut s, "{}", SetAttribute(Attribute::Reset)).unwrap();
80
-
81
- write!(&mut s, "{}", SetForegroundColor(Color::Grey)).unwrap();
82
- s.push(']');
83
- write!(&mut s, "{}", ResetColor).unwrap();
84
-
85
- s
86
- }
87
-
88
- #[cfg(not(feature = "cli"))]
89
- fn language_signature(&self) -> String {
90
- "[Devalang]".to_string()
91
- }
92
-
93
- // --- format_status ---
94
-
95
- #[cfg(feature = "cli")]
96
- fn format_status(&self, level: LogLevel) -> String {
97
- let mut s = String::new();
98
-
99
- let color = match level {
100
- LogLevel::Success => Color::Rgb { r: 76, g: 175, b: 80 },
101
- LogLevel::Error => Color::Rgb { r: 244, g: 67, b: 54 },
102
- LogLevel::Info => Color::Rgb { r: 33, g: 150, b: 243 },
103
- LogLevel::Warning => Color::Rgb { r: 255, g: 152, b: 0 },
104
- LogLevel::Watcher => Color::Rgb { r: 156, g: 39, b: 176 },
105
- LogLevel::Debug => Color::Rgb { r: 103, g: 58, b: 183 },
106
- LogLevel::Print => Color::Rgb { r: 255, g: 255, b: 255 },
107
- };
108
-
109
- let status = match level {
110
- LogLevel::Success => "SUCCESS",
111
- LogLevel::Error => "ERROR",
112
- LogLevel::Info => "INFO",
113
- LogLevel::Warning => "WARNING",
114
- LogLevel::Watcher => "WATCHER",
115
- LogLevel::Debug => "DEBUG",
116
- LogLevel::Print => "PRINT",
117
- };
118
-
119
- s.push('[');
120
- write!(&mut s, "{}", SetForegroundColor(color)).unwrap();
121
- write!(&mut s, "{}", SetAttribute(Attribute::Bold)).unwrap();
122
- s.push_str(status);
123
- write!(&mut s, "{}", SetAttribute(Attribute::Reset)).unwrap();
124
- s.push(']');
125
- write!(&mut s, "{}", ResetColor).unwrap();
126
-
127
- s
128
- }
129
-
130
- #[cfg(not(feature = "cli"))]
131
- fn format_status(&self, level: LogLevel) -> String {
132
- match level {
133
- LogLevel::Success => "[SUCCESS]",
134
- LogLevel::Error => "[ERROR]",
135
- LogLevel::Info => "[INFO]",
136
- LogLevel::Warning => "[WARNING]",
137
- LogLevel::Watcher => "[WATCHER]",
138
- LogLevel::Debug => "[DEBUG]",
139
- LogLevel::Print => "[PRINT]",
140
- }
141
- .to_string()
142
- }
143
- }
1
+ #[cfg(feature = "cli")]
2
+ use crossterm::style::{Attribute, Color, ResetColor, SetAttribute, SetForegroundColor};
3
+ use std::fmt::Write;
4
+
5
+ #[derive(Debug, Clone, PartialEq)]
6
+ pub enum LogLevel {
7
+ Success,
8
+ Error,
9
+ Info,
10
+ Print,
11
+ Warning,
12
+ Watcher,
13
+ Debug,
14
+ }
15
+
16
+ #[derive(Debug, Clone)]
17
+ pub struct Logger;
18
+
19
+ impl Logger {
20
+ pub fn new() -> Self {
21
+ Logger
22
+ }
23
+
24
+ // --- log_message ---
25
+
26
+ #[cfg(feature = "cli")]
27
+ pub fn log_message(&self, level: LogLevel, message: &str) {
28
+ let formatted_status = self.format_status(level);
29
+ println!(
30
+ "🦊 {} {} {}",
31
+ self.language_signature(),
32
+ formatted_status,
33
+ message
34
+ );
35
+ }
36
+
37
+ #[cfg(not(feature = "cli"))]
38
+ pub fn log_message(&self, _level: LogLevel, _message: &str) {
39
+ // no-op for WASM
40
+ }
41
+
42
+ // --- log_message_with_trace ---
43
+
44
+ #[cfg(feature = "cli")]
45
+ pub fn log_message_with_trace(&self, level: LogLevel, message: &str, trace: Vec<&str>) {
46
+ let formatted_status = self.format_status(level);
47
+ println!(
48
+ "🦊 {} {} {}",
49
+ self.language_signature(),
50
+ formatted_status,
51
+ message
52
+ );
53
+ for t in trace {
54
+ println!(" ↳ {}", t);
55
+ }
56
+ }
57
+
58
+ #[cfg(not(feature = "cli"))]
59
+ pub fn log_message_with_trace(&self, _level: LogLevel, _message: &str, _trace: Vec<&str>) {
60
+ // no-op for WASM
61
+ }
62
+
63
+ // --- log_error_with_stacktrace ---
64
+
65
+ #[cfg(feature = "cli")]
66
+ pub fn log_error_with_stacktrace(&self, message: &str, stacktrace: &str) {
67
+ let formatted_status = self.format_status(LogLevel::Error);
68
+ println!(
69
+ "🦊 {} {} {}",
70
+ self.language_signature(),
71
+ formatted_status,
72
+ message
73
+ );
74
+ println!(" ↳ {}", stacktrace);
75
+ }
76
+
77
+ #[cfg(not(feature = "cli"))]
78
+ pub fn log_error_with_stacktrace(&self, _message: &str, _stacktrace: &str) {
79
+ // no-op for WASM
80
+ }
81
+
82
+ // --- language_signature ---
83
+
84
+ #[cfg(feature = "cli")]
85
+ fn language_signature(&self) -> String {
86
+ let mut s = String::new();
87
+
88
+ write!(&mut s, "{}", SetForegroundColor(Color::Grey)).unwrap();
89
+ s.push('[');
90
+
91
+ write!(
92
+ &mut s,
93
+ "{}",
94
+ SetForegroundColor(Color::Rgb {
95
+ r: 29,
96
+ g: 211,
97
+ b: 176
98
+ })
99
+ )
100
+ .unwrap();
101
+ write!(&mut s, "{}", SetAttribute(Attribute::Bold)).unwrap();
102
+ s.push_str("Devalang");
103
+ write!(&mut s, "{}", SetAttribute(Attribute::Reset)).unwrap();
104
+
105
+ write!(&mut s, "{}", SetForegroundColor(Color::Grey)).unwrap();
106
+ s.push(']');
107
+ write!(&mut s, "{}", ResetColor).unwrap();
108
+
109
+ s
110
+ }
111
+
112
+ #[cfg(not(feature = "cli"))]
113
+ fn language_signature(&self) -> String {
114
+ "[Devalang]".to_string()
115
+ }
116
+
117
+ // --- format_status ---
118
+
119
+ #[cfg(feature = "cli")]
120
+ fn format_status(&self, level: LogLevel) -> String {
121
+ let mut s = String::new();
122
+
123
+ let color = match level {
124
+ LogLevel::Success => Color::Rgb {
125
+ r: 76,
126
+ g: 175,
127
+ b: 80,
128
+ },
129
+ LogLevel::Error => Color::Rgb {
130
+ r: 244,
131
+ g: 67,
132
+ b: 54,
133
+ },
134
+ LogLevel::Info => Color::Rgb {
135
+ r: 33,
136
+ g: 150,
137
+ b: 243,
138
+ },
139
+ LogLevel::Warning => Color::Rgb {
140
+ r: 255,
141
+ g: 152,
142
+ b: 0,
143
+ },
144
+ LogLevel::Watcher => Color::Rgb {
145
+ r: 156,
146
+ g: 39,
147
+ b: 176,
148
+ },
149
+ LogLevel::Debug => Color::Rgb {
150
+ r: 103,
151
+ g: 58,
152
+ b: 183,
153
+ },
154
+ LogLevel::Print => Color::Rgb {
155
+ r: 255,
156
+ g: 255,
157
+ b: 255,
158
+ },
159
+ };
160
+
161
+ let status = match level {
162
+ LogLevel::Success => "SUCCESS",
163
+ LogLevel::Error => "ERROR",
164
+ LogLevel::Info => "INFO",
165
+ LogLevel::Warning => "WARNING",
166
+ LogLevel::Watcher => "WATCHER",
167
+ LogLevel::Debug => "DEBUG",
168
+ LogLevel::Print => "PRINT",
169
+ };
170
+
171
+ s.push('[');
172
+ write!(&mut s, "{}", SetForegroundColor(color)).unwrap();
173
+ write!(&mut s, "{}", SetAttribute(Attribute::Bold)).unwrap();
174
+ s.push_str(status);
175
+ write!(&mut s, "{}", SetAttribute(Attribute::Reset)).unwrap();
176
+ s.push(']');
177
+ write!(&mut s, "{}", ResetColor).unwrap();
178
+
179
+ s
180
+ }
181
+
182
+ #[cfg(not(feature = "cli"))]
183
+ fn format_status(&self, level: LogLevel) -> String {
184
+ match level {
185
+ LogLevel::Success => "[SUCCESS]",
186
+ LogLevel::Error => "[ERROR]",
187
+ LogLevel::Info => "[INFO]",
188
+ LogLevel::Warning => "[WARNING]",
189
+ LogLevel::Watcher => "[WATCHER]",
190
+ LogLevel::Debug => "[DEBUG]",
191
+ LogLevel::Print => "[PRINT]",
192
+ }
193
+ .to_string()
194
+ }
195
+ }
package/rust/utils/mod.rs CHANGED
@@ -1,7 +1,9 @@
1
- pub mod version;
2
- pub mod signature;
3
- pub mod spinner;
4
- pub mod watcher;
5
- pub mod file;
6
- pub mod logger;
7
- pub mod error;
1
+ pub mod error;
2
+ pub mod file;
3
+ pub mod first_usage;
4
+ pub mod logger;
5
+ pub mod signature;
6
+ pub mod spinner;
7
+ pub mod telemetry;
8
+ pub mod version;
9
+ pub mod watcher;
@@ -1,17 +1,19 @@
1
- pub fn get_signature(version: &str) -> String {
2
- let signature =
3
- format!(r#"
4
- /|_/|
5
- / ^ ^(_o 🦊 Devalang
6
- / __.'
7
- / \ A programming language for music and sound.
8
- / _ \_ Part of Devaloop project.
9
- (_) (_) '._
10
- '.__ '. .-''-'. https://devaloop.com
11
- ( '. ('.____.''
12
- _) )'_, ) v{}
13
- (__/ (__/
14
- "#, version);
15
-
16
- signature
17
- }
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
+ }
@@ -1,19 +1,22 @@
1
- #[cfg(feature = "cli")]
2
- use indicatif::{ ProgressBar, ProgressStyle };
3
- use std::{ time::Duration };
4
-
5
- #[cfg(feature = "cli")]
6
- pub fn with_spinner<T, F>(start_msg: &str, f: F) -> ProgressBar where F: FnOnce() -> T {
7
- let spinner = ProgressBar::new_spinner();
8
- spinner.set_style(
9
- ProgressStyle::with_template("{spinner:.green} {msg}")
10
- .unwrap()
11
- .tick_strings(&["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"])
12
- );
13
- spinner.set_message(start_msg.to_string());
14
- spinner.enable_steady_tick(Duration::from_millis(80));
15
-
16
- let _ = f();
17
-
18
- spinner
19
- }
1
+ #[cfg(feature = "cli")]
2
+ use indicatif::{ProgressBar, ProgressStyle};
3
+ use std::time::Duration;
4
+
5
+ #[cfg(feature = "cli")]
6
+ pub fn with_spinner<T, F>(start_msg: &str, f: F) -> ProgressBar
7
+ where
8
+ F: FnOnce() -> T,
9
+ {
10
+ let spinner = ProgressBar::new_spinner();
11
+ spinner.set_style(
12
+ ProgressStyle::with_template("{spinner:.green} {msg}")
13
+ .unwrap()
14
+ .tick_strings(&["⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"]),
15
+ );
16
+ spinner.set_message(start_msg.to_string());
17
+ spinner.enable_steady_tick(Duration::from_millis(80));
18
+
19
+ let _ = f();
20
+
21
+ spinner
22
+ }