@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.
Files changed (177) hide show
  1. package/.devalang +10 -8
  2. package/.github/workflows/ci.yml +92 -0
  3. package/Cargo.toml +60 -58
  4. package/README.md +32 -15
  5. package/docs/CHANGELOG.md +93 -1
  6. package/docs/CONTRIBUTING.md +101 -1
  7. package/docs/ROADMAP.md +2 -2
  8. package/docs/TODO.md +1 -1
  9. package/examples/automation.deva +42 -0
  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 +39 -25
  14. package/examples/loop.deva +5 -11
  15. package/examples/pattern.deva +8 -0
  16. package/examples/plugin.deva +16 -0
  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 -456
  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 -8
  38. package/rust/common/cdn.rs +3 -6
  39. package/rust/common/mod.rs +3 -3
  40. package/rust/common/sso.rs +3 -6
  41. package/rust/config/driver.rs +118 -94
  42. package/rust/config/loader.rs +165 -156
  43. package/rust/config/mod.rs +4 -2
  44. package/rust/config/settings.rs +91 -0
  45. package/rust/config/stats.rs +257 -0
  46. package/rust/core/audio/engine.rs +696 -518
  47. package/rust/core/audio/evaluator.rs +263 -31
  48. package/rust/core/audio/interpreter/arrow_call.rs +198 -161
  49. package/rust/core/audio/interpreter/automate.rs +18 -0
  50. package/rust/core/audio/interpreter/call.rs +98 -95
  51. package/rust/core/audio/interpreter/condition.rs +70 -71
  52. package/rust/core/audio/interpreter/driver.rs +487 -198
  53. package/rust/core/audio/interpreter/function.rs +26 -21
  54. package/rust/core/audio/interpreter/let_.rs +38 -19
  55. package/rust/core/audio/interpreter/load.rs +18 -18
  56. package/rust/core/audio/interpreter/loop_.rs +113 -73
  57. package/rust/core/audio/interpreter/mod.rs +14 -13
  58. package/rust/core/audio/interpreter/sleep.rs +27 -30
  59. package/rust/core/audio/interpreter/spawn.rs +105 -102
  60. package/rust/core/audio/interpreter/tempo.rs +19 -16
  61. package/rust/core/audio/interpreter/trigger.rs +239 -210
  62. package/rust/core/audio/loader/mod.rs +1 -1
  63. package/rust/core/audio/loader/trigger.rs +100 -97
  64. package/rust/core/audio/mod.rs +7 -6
  65. package/rust/core/audio/player.rs +64 -64
  66. package/rust/core/audio/renderer.rs +56 -53
  67. package/rust/core/audio/special/easing.rs +189 -0
  68. package/rust/core/audio/special/env.rs +43 -0
  69. package/rust/core/audio/special/math.rs +102 -0
  70. package/rust/core/audio/special/mod.rs +9 -0
  71. package/rust/core/audio/special/modulator.rs +143 -0
  72. package/rust/core/builder/mod.rs +80 -85
  73. package/rust/core/debugger/lexer.rs +27 -27
  74. package/rust/core/debugger/mod.rs +24 -23
  75. package/rust/core/debugger/module.rs +55 -47
  76. package/rust/core/debugger/preprocessor.rs +27 -27
  77. package/rust/core/debugger/store.rs +40 -39
  78. package/rust/core/error/mod.rs +80 -66
  79. package/rust/core/lexer/handler/arrow.rs +82 -31
  80. package/rust/core/lexer/handler/at.rs +21 -21
  81. package/rust/core/lexer/handler/brace.rs +41 -41
  82. package/rust/core/lexer/handler/colon.rs +21 -21
  83. package/rust/core/lexer/handler/comment.rs +30 -30
  84. package/rust/core/lexer/handler/dot.rs +21 -21
  85. package/rust/core/lexer/handler/driver.rs +337 -263
  86. package/rust/core/lexer/handler/identifier.rs +46 -42
  87. package/rust/core/lexer/handler/indent.rs +66 -66
  88. package/rust/core/lexer/handler/mod.rs +16 -16
  89. package/rust/core/lexer/handler/newline.rs +23 -23
  90. package/rust/core/lexer/handler/number.rs +31 -31
  91. package/rust/core/lexer/handler/operator.rs +46 -44
  92. package/rust/core/lexer/handler/parenthesis.rs +41 -41
  93. package/rust/core/lexer/handler/slash.rs +21 -21
  94. package/rust/core/lexer/handler/string.rs +63 -63
  95. package/rust/core/lexer/mod.rs +54 -51
  96. package/rust/core/lexer/token.rs +97 -91
  97. package/rust/core/mod.rs +11 -11
  98. package/rust/core/parser/driver.rs +513 -408
  99. package/rust/core/parser/handler/arrow_call.rs +233 -211
  100. package/rust/core/parser/handler/at.rs +245 -162
  101. package/rust/core/parser/handler/bank.rs +94 -69
  102. package/rust/core/parser/handler/condition.rs +80 -74
  103. package/rust/core/parser/handler/dot.rs +143 -135
  104. package/rust/core/parser/handler/identifier/automate.rs +257 -0
  105. package/rust/core/parser/handler/identifier/call.rs +91 -88
  106. package/rust/core/parser/handler/identifier/emit.rs +66 -0
  107. package/rust/core/parser/handler/identifier/function.rs +100 -92
  108. package/rust/core/parser/handler/identifier/group.rs +85 -75
  109. package/rust/core/parser/handler/identifier/let_.rs +158 -127
  110. package/rust/core/parser/handler/identifier/mod.rs +54 -52
  111. package/rust/core/parser/handler/identifier/on.rs +98 -0
  112. package/rust/core/parser/handler/identifier/print.rs +52 -0
  113. package/rust/core/parser/handler/identifier/sleep.rs +36 -33
  114. package/rust/core/parser/handler/identifier/spawn.rs +91 -88
  115. package/rust/core/parser/handler/identifier/synth.rs +65 -65
  116. package/rust/core/parser/handler/loop_.rs +170 -72
  117. package/rust/core/parser/handler/mod.rs +8 -8
  118. package/rust/core/parser/handler/tempo.rs +53 -47
  119. package/rust/core/parser/mod.rs +4 -4
  120. package/rust/core/parser/statement.rs +142 -108
  121. package/rust/core/plugin/loader.rs +123 -48
  122. package/rust/core/plugin/mod.rs +2 -1
  123. package/rust/core/plugin/runner.rs +296 -0
  124. package/rust/core/preprocessor/loader.rs +515 -326
  125. package/rust/core/preprocessor/mod.rs +4 -4
  126. package/rust/core/preprocessor/module.rs +60 -58
  127. package/rust/core/preprocessor/processor.rs +99 -101
  128. package/rust/core/preprocessor/resolver/bank.rs +51 -49
  129. package/rust/core/preprocessor/resolver/call.rs +100 -100
  130. package/rust/core/preprocessor/resolver/condition.rs +97 -97
  131. package/rust/core/preprocessor/resolver/driver.rs +310 -278
  132. package/rust/core/preprocessor/resolver/function.rs +69 -78
  133. package/rust/core/preprocessor/resolver/group.rs +96 -91
  134. package/rust/core/preprocessor/resolver/let_.rs +32 -28
  135. package/rust/core/preprocessor/resolver/loop_.rs +320 -91
  136. package/rust/core/preprocessor/resolver/mod.rs +15 -15
  137. package/rust/core/preprocessor/resolver/spawn.rs +76 -92
  138. package/rust/core/preprocessor/resolver/synth.rs +56 -50
  139. package/rust/core/preprocessor/resolver/tempo.rs +50 -49
  140. package/rust/core/preprocessor/resolver/trigger.rs +113 -116
  141. package/rust/core/preprocessor/resolver/value.rs +81 -87
  142. package/rust/core/shared/bank.rs +1 -1
  143. package/rust/core/shared/duration.rs +9 -9
  144. package/rust/core/shared/mod.rs +3 -3
  145. package/rust/core/shared/value.rs +35 -32
  146. package/rust/core/store/function.rs +34 -34
  147. package/rust/core/store/global.rs +55 -38
  148. package/rust/core/store/mod.rs +5 -5
  149. package/rust/core/store/variable.rs +37 -34
  150. package/rust/core/utils/mod.rs +2 -2
  151. package/rust/core/utils/path.rs +37 -31
  152. package/rust/core/utils/validation.rs +35 -37
  153. package/rust/installer/addon.rs +84 -80
  154. package/rust/installer/bank.rs +62 -65
  155. package/rust/installer/mod.rs +5 -5
  156. package/rust/installer/plugin.rs +54 -55
  157. package/rust/installer/utils.rs +56 -56
  158. package/rust/lib.rs +156 -164
  159. package/rust/main.rs +250 -145
  160. package/rust/utils/error.rs +200 -0
  161. package/rust/utils/file.rs +38 -35
  162. package/rust/utils/first_usage.rs +76 -0
  163. package/rust/utils/logger.rs +195 -139
  164. package/rust/utils/mod.rs +9 -50
  165. package/rust/utils/signature.rs +19 -17
  166. package/rust/utils/spinner.rs +22 -19
  167. package/rust/utils/telemetry.rs +292 -0
  168. package/rust/utils/watcher.rs +34 -33
  169. package/templates/minimal/README.md +97 -121
  170. package/templates/welcome/README.md +97 -121
  171. package/typescript/bin/index.ts +19 -5
  172. package/typescript/index.ts +3 -1
  173. package/typescript/scripts/postbuild.ts +10 -6
  174. package/typescript/scripts/postinstall.ts +56 -0
  175. package/typescript/scripts/version/bump.ts +0 -1
  176. package/typescript/scripts/version/index.ts +0 -1
  177. package/out-tsc/bin/devalang.exe +0 -0
@@ -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,139 +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
- Warning,
11
- Watcher,
12
- Debug,
13
- }
14
-
15
- #[derive(Debug, Clone)]
16
- pub struct Logger;
17
-
18
- impl Logger {
19
- pub fn new() -> Self {
20
- Logger
21
- }
22
-
23
- // --- log_message ---
24
-
25
- #[cfg(feature = "cli")]
26
- pub fn log_message(&self, level: LogLevel, message: &str) {
27
- let formatted_status = self.format_status(level);
28
- println!("🦊 {} {} {}", self.language_signature(), formatted_status, message);
29
- }
30
-
31
- #[cfg(not(feature = "cli"))]
32
- pub fn log_message(&self, _level: LogLevel, _message: &str) {
33
- // no-op for WASM
34
- }
35
-
36
- // --- log_message_with_trace ---
37
-
38
- #[cfg(feature = "cli")]
39
- pub fn log_message_with_trace(&self, level: LogLevel, message: &str, trace: Vec<&str>) {
40
- let formatted_status = self.format_status(level);
41
- println!("🦊 {} {} {}", self.language_signature(), formatted_status, message);
42
- for t in trace {
43
- println!(" ↳ {}", t);
44
- }
45
- }
46
-
47
- #[cfg(not(feature = "cli"))]
48
- pub fn log_message_with_trace(&self, _level: LogLevel, _message: &str, _trace: Vec<&str>) {
49
- // no-op for WASM
50
- }
51
-
52
- // --- log_error_with_stacktrace ---
53
-
54
- #[cfg(feature = "cli")]
55
- pub fn log_error_with_stacktrace(&self, message: &str, stacktrace: &str) {
56
- let formatted_status = self.format_status(LogLevel::Error);
57
- println!("🦊 {} {} {}", self.language_signature(), formatted_status, message);
58
- println!(" ↳ {}", stacktrace);
59
- }
60
-
61
- #[cfg(not(feature = "cli"))]
62
- pub fn log_error_with_stacktrace(&self, _message: &str, _stacktrace: &str) {
63
- // no-op for WASM
64
- }
65
-
66
- // --- language_signature ---
67
-
68
- #[cfg(feature = "cli")]
69
- fn language_signature(&self) -> String {
70
- let mut s = String::new();
71
-
72
- write!(&mut s, "{}", SetForegroundColor(Color::Grey)).unwrap();
73
- s.push('[');
74
-
75
- write!(&mut s, "{}", SetForegroundColor(Color::Rgb { r: 29, g: 211, b: 176 })).unwrap();
76
- write!(&mut s, "{}", SetAttribute(Attribute::Bold)).unwrap();
77
- s.push_str("Devalang");
78
- write!(&mut s, "{}", SetAttribute(Attribute::Reset)).unwrap();
79
-
80
- write!(&mut s, "{}", SetForegroundColor(Color::Grey)).unwrap();
81
- s.push(']');
82
- write!(&mut s, "{}", ResetColor).unwrap();
83
-
84
- s
85
- }
86
-
87
- #[cfg(not(feature = "cli"))]
88
- fn language_signature(&self) -> String {
89
- "[Devalang]".to_string()
90
- }
91
-
92
- // --- format_status ---
93
-
94
- #[cfg(feature = "cli")]
95
- fn format_status(&self, level: LogLevel) -> String {
96
- let mut s = String::new();
97
-
98
- let color = match level {
99
- LogLevel::Success => Color::Rgb { r: 76, g: 175, b: 80 },
100
- LogLevel::Error => Color::Rgb { r: 244, g: 67, b: 54 },
101
- LogLevel::Info => Color::Rgb { r: 33, g: 150, b: 243 },
102
- LogLevel::Warning => Color::Rgb { r: 255, g: 152, b: 0 },
103
- LogLevel::Watcher => Color::Rgb { r: 156, g: 39, b: 176 },
104
- LogLevel::Debug => Color::Rgb { r: 103, g: 58, b: 183 },
105
- };
106
-
107
- let status = match level {
108
- LogLevel::Success => "SUCCESS",
109
- LogLevel::Error => "ERROR",
110
- LogLevel::Info => "INFO",
111
- LogLevel::Warning => "WARNING",
112
- LogLevel::Watcher => "WATCHER",
113
- LogLevel::Debug => "DEBUG",
114
- };
115
-
116
- s.push('[');
117
- write!(&mut s, "{}", SetForegroundColor(color)).unwrap();
118
- write!(&mut s, "{}", SetAttribute(Attribute::Bold)).unwrap();
119
- s.push_str(status);
120
- write!(&mut s, "{}", SetAttribute(Attribute::Reset)).unwrap();
121
- s.push(']');
122
- write!(&mut s, "{}", ResetColor).unwrap();
123
-
124
- s
125
- }
126
-
127
- #[cfg(not(feature = "cli"))]
128
- fn format_status(&self, level: LogLevel) -> String {
129
- match level {
130
- LogLevel::Success => "[SUCCESS]",
131
- LogLevel::Error => "[ERROR]",
132
- LogLevel::Info => "[INFO]",
133
- LogLevel::Warning => "[WARNING]",
134
- LogLevel::Watcher => "[WATCHER]",
135
- LogLevel::Debug => "[DEBUG]",
136
- }
137
- .to_string()
138
- }
139
- }
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,50 +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
-
8
- use crate::core::parser::statement::{Statement, StatementKind};
9
- use crate::core::error::ErrorResult;
10
- use crate::core::shared::value::Value;
11
-
12
- pub fn collect_errors_recursively(statements: &[Statement]) -> Vec<ErrorResult> {
13
- let mut errors: Vec<ErrorResult> = Vec::new();
14
-
15
- for stmt in statements {
16
- match &stmt.kind {
17
- StatementKind::Unknown => {
18
- errors.push(ErrorResult {
19
- message: format!("Unknown statement at line {}:{}", stmt.line, stmt.column),
20
- line: stmt.line,
21
- column: stmt.column,
22
- });
23
- }
24
- StatementKind::Error { message } => {
25
- errors.push(ErrorResult {
26
- message: message.clone(),
27
- line: stmt.line,
28
- column: stmt.column,
29
- });
30
- }
31
- StatementKind::Loop => {
32
- if let Some(body_statements) = extract_loop_body_statements(&stmt.value) {
33
- errors.extend(collect_errors_recursively(body_statements));
34
- }
35
- }
36
- _ => {}
37
- }
38
- }
39
-
40
- errors
41
- }
42
-
43
- pub fn extract_loop_body_statements(value: &Value) -> Option<&[Statement]> {
44
- if let Value::Map(map) = value {
45
- if let Some(Value::Block(statements)) = map.get("body") {
46
- return Some(statements);
47
- }
48
- }
49
- None
50
- }
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 result = 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
+ }