@devaloop/devalang 0.0.1-beta.1 → 0.0.1-beta.3

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 (207) hide show
  1. package/.devalang +9 -10
  2. package/Cargo.toml +84 -80
  3. package/README.md +10 -7
  4. package/docs/CHANGELOG.md +83 -0
  5. package/docs/ROADMAP.md +6 -2
  6. package/docs/TODO.md +3 -14
  7. package/examples/bus.deva +10 -0
  8. package/examples/chain.deva +19 -0
  9. package/examples/effect.deva +2 -0
  10. package/examples/filter.deva +11 -0
  11. package/examples/lfo.deva +9 -0
  12. package/examples/plugin.deva +10 -10
  13. package/examples/routing.deva +23 -0
  14. package/examples/synth.deva +11 -1
  15. package/examples/synth_types.deva +17 -0
  16. package/out-tsc/bin/project-version.json +6 -0
  17. package/out-tsc/core/functions/index.d.ts +5 -0
  18. package/out-tsc/core/functions/index.js +11 -0
  19. package/out-tsc/pkg/devalang_core.d.ts +2 -0
  20. package/out-tsc/pkg/devalang_core.js +17 -2
  21. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +1 -0
  22. package/out-tsc/scripts/version/copy-to-binary.d.ts +1 -0
  23. package/out-tsc/scripts/version/copy-to-binary.js +79 -0
  24. package/package.json +23 -10
  25. package/project-version.json +3 -3
  26. package/rust/bindings/Cargo.toml +9 -0
  27. package/rust/bindings/src/lib.rs +86 -0
  28. package/rust/cli/addon/commands.rs +35 -0
  29. package/rust/cli/addon/download.rs +234 -0
  30. package/rust/cli/addon/install.rs +33 -0
  31. package/rust/cli/addon/list.rs +224 -0
  32. package/rust/cli/addon/metadata.rs +124 -0
  33. package/rust/cli/addon/mod.rs +8 -0
  34. package/rust/cli/addon/remove.rs +271 -0
  35. package/rust/cli/addon/update.rs +305 -0
  36. package/rust/cli/{install/addon.rs → addon/utils.rs} +34 -43
  37. package/rust/cli/build/commands.rs +153 -103
  38. package/rust/cli/build/mod.rs +2 -2
  39. package/rust/cli/build/process.rs +165 -146
  40. package/rust/cli/check/mod.rs +208 -208
  41. package/rust/cli/discover/commands.rs +53 -31
  42. package/rust/cli/discover/config.rs +2 -4
  43. package/rust/cli/discover/install.rs +139 -28
  44. package/rust/cli/discover/metadata.rs +3 -3
  45. package/rust/cli/login/commands.rs +124 -124
  46. package/rust/cli/me/commands.rs +52 -0
  47. package/rust/cli/me/mod.rs +1 -0
  48. package/rust/cli/mod.rs +2 -2
  49. package/rust/cli/parser.rs +76 -70
  50. package/rust/cli/play/commands.rs +375 -324
  51. package/rust/cli/play/mod.rs +5 -5
  52. package/rust/cli/play/process.rs +159 -150
  53. package/rust/cli/play/realtime.rs +91 -91
  54. package/rust/cli/telemetry/commands.rs +22 -22
  55. package/rust/cli/telemetry/event_creator.rs +80 -80
  56. package/rust/cli/telemetry/mod.rs +3 -3
  57. package/rust/cli/telemetry/send.rs +51 -51
  58. package/rust/cli/template/commands.rs +69 -69
  59. package/rust/config/driver.rs +112 -103
  60. package/rust/config/mod.rs +3 -3
  61. package/rust/config/ops.rs +26 -26
  62. package/rust/config/settings.rs +101 -101
  63. package/rust/core/audio/engine/driver.rs +237 -0
  64. package/rust/core/audio/engine/export.rs +169 -0
  65. package/rust/core/audio/engine/helpers.rs +178 -170
  66. package/rust/core/audio/engine/mod.rs +56 -7
  67. package/rust/core/audio/engine/notes/dsp.rs +88 -0
  68. package/rust/core/audio/engine/notes/mod.rs +53 -0
  69. package/rust/core/audio/engine/notes/params.rs +294 -0
  70. package/rust/core/audio/engine/sample/insert.rs +300 -0
  71. package/rust/core/audio/engine/sample/mod.rs +40 -0
  72. package/rust/core/audio/engine/sample/padding.rs +170 -0
  73. package/rust/core/audio/evaluator/condition.rs +61 -0
  74. package/rust/core/audio/evaluator/mod.rs +9 -0
  75. package/rust/core/audio/{evaluator.rs → evaluator/numeric.rs} +152 -310
  76. package/rust/core/audio/evaluator/rhs.rs +16 -0
  77. package/rust/core/audio/evaluator/string_expr.rs +94 -0
  78. package/rust/core/audio/interpreter/driver.rs +574 -542
  79. package/rust/core/audio/interpreter/mod.rs +2 -14
  80. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +179 -0
  81. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +398 -0
  82. package/rust/core/audio/interpreter/statements/arrow_call/methods/effects.rs +323 -0
  83. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +3 -0
  84. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +371 -0
  85. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +3 -0
  86. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +192 -0
  87. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +24 -0
  88. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +116 -0
  89. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +97 -0
  90. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +100 -0
  91. package/rust/core/audio/interpreter/{automate.rs → statements/automate.rs} +2 -4
  92. package/rust/core/audio/interpreter/{call.rs → statements/call.rs} +36 -5
  93. package/rust/core/audio/interpreter/{condition.rs → statements/condition.rs} +72 -71
  94. package/rust/core/audio/interpreter/{function.rs → statements/function.rs} +24 -26
  95. package/rust/core/audio/interpreter/{let_.rs → statements/let_.rs} +36 -38
  96. package/rust/core/audio/interpreter/{load.rs → statements/load.rs} +17 -19
  97. package/rust/core/audio/interpreter/{loop_.rs → statements/loop_.rs} +115 -114
  98. package/rust/core/audio/interpreter/statements/mod.rs +12 -0
  99. package/rust/core/audio/interpreter/{sleep.rs → statements/sleep.rs} +28 -28
  100. package/rust/core/audio/interpreter/{spawn.rs → statements/spawn.rs} +54 -4
  101. package/rust/core/audio/interpreter/{tempo.rs → statements/tempo.rs} +40 -40
  102. package/rust/core/audio/interpreter/{trigger.rs → statements/trigger.rs} +242 -239
  103. package/rust/core/audio/loader/trigger.rs +98 -97
  104. package/rust/core/audio/mod.rs +6 -7
  105. package/rust/core/audio/special/easing.rs +189 -189
  106. package/rust/core/audio/special/env.rs +45 -45
  107. package/rust/core/audio/special/math.rs +134 -134
  108. package/rust/core/audio/special/modulator.rs +143 -143
  109. package/rust/core/builder/mod.rs +129 -86
  110. package/rust/core/debugger/{module.rs → logs.rs} +52 -55
  111. package/rust/core/debugger/mod.rs +30 -30
  112. package/rust/core/debugger/store.rs +38 -40
  113. package/rust/core/error/mod.rs +269 -269
  114. package/rust/core/lexer/driver.rs +2 -4
  115. package/rust/core/mod.rs +9 -10
  116. package/rust/core/parser/driver/block.rs +111 -0
  117. package/rust/core/parser/driver/cursor.rs +82 -0
  118. package/rust/core/parser/driver/driver_impl.rs +159 -0
  119. package/rust/core/parser/driver/mod.rs +6 -0
  120. package/rust/core/parser/driver/parse_array.rs +120 -0
  121. package/rust/core/parser/driver/parse_map.rs +247 -0
  122. package/rust/core/parser/driver/parser.rs +160 -0
  123. package/rust/core/parser/handler/arrow_call.rs +90 -15
  124. package/rust/core/parser/handler/at.rs +279 -279
  125. package/rust/core/parser/handler/bank.rs +104 -104
  126. package/rust/core/parser/handler/condition.rs +83 -83
  127. package/rust/core/parser/handler/dot.rs +148 -148
  128. package/rust/core/parser/handler/identifier/automate.rs +254 -254
  129. package/rust/core/parser/handler/identifier/call.rs +91 -91
  130. package/rust/core/parser/handler/identifier/emit.rs +70 -70
  131. package/rust/core/parser/handler/identifier/function.rs +113 -113
  132. package/rust/core/parser/handler/identifier/group.rs +89 -89
  133. package/rust/core/parser/handler/identifier/let_.rs +173 -173
  134. package/rust/core/parser/handler/identifier/mod.rs +55 -55
  135. package/rust/core/parser/handler/identifier/on.rs +107 -107
  136. package/rust/core/parser/handler/identifier/print.rs +49 -49
  137. package/rust/core/parser/handler/identifier/sleep.rs +96 -43
  138. package/rust/core/parser/handler/identifier/spawn.rs +91 -91
  139. package/rust/core/parser/handler/identifier/synth.rs +39 -3
  140. package/rust/core/parser/handler/loop_.rs +194 -194
  141. package/rust/core/parser/handler/pattern.rs +25 -2
  142. package/rust/core/parser/handler/tempo.rs +105 -57
  143. package/rust/core/parser/statement.rs +10 -11
  144. package/rust/core/plugin/loader.rs +137 -137
  145. package/rust/core/plugin/runner/mod.rs +11 -0
  146. package/rust/core/plugin/{runner.rs → runner/non_wasm.rs} +206 -72
  147. package/rust/core/plugin/runner/wasm32.rs +44 -0
  148. package/rust/core/preprocessor/loader/inject.rs +313 -0
  149. package/rust/core/preprocessor/loader/loader_helpers.rs +110 -0
  150. package/rust/core/preprocessor/loader/mod.rs +235 -0
  151. package/rust/core/preprocessor/module.rs +55 -60
  152. package/rust/core/preprocessor/{processor.rs → processor/handlers.rs} +107 -114
  153. package/rust/core/preprocessor/processor/mod.rs +1 -0
  154. package/rust/core/preprocessor/resolver/function.rs +69 -69
  155. package/rust/core/preprocessor/resolver/group.rs +122 -94
  156. package/rust/core/preprocessor/resolver/pattern.rs +14 -2
  157. package/rust/core/store/global.rs +57 -61
  158. package/rust/core/store/mod.rs +1 -5
  159. package/rust/lib.rs +323 -308
  160. package/rust/macros/Cargo.toml +14 -0
  161. package/rust/macros/src/lib.rs +52 -0
  162. package/rust/main.rs +336 -143
  163. package/rust/types/Cargo.toml +1 -1
  164. package/rust/types/src/addons.rs +57 -55
  165. package/rust/types/src/config.rs +82 -74
  166. package/rust/types/src/lib.rs +15 -12
  167. package/rust/types/src/plugin.rs +20 -0
  168. package/rust/types/src/store.rs +139 -0
  169. package/rust/types/src/telemetry.rs +85 -85
  170. package/rust/utils/Cargo.toml +5 -2
  171. package/rust/utils/src/file.rs +477 -94
  172. package/rust/utils/src/first_usage.rs +97 -97
  173. package/rust/utils/src/lib.rs +9 -9
  174. package/rust/utils/src/logger.rs +200 -200
  175. package/rust/utils/src/path.rs +158 -88
  176. package/rust/utils/src/signature.rs +41 -41
  177. package/rust/utils/src/spinner.rs +20 -20
  178. package/rust/utils/src/version.rs +58 -27
  179. package/rust/utils/src/watcher.rs +46 -46
  180. package/rust/web/api.rs +5 -5
  181. package/rust/web/auth.rs +5 -0
  182. package/rust/web/cdn.rs +34 -34
  183. package/rust/web/forge.rs +5 -0
  184. package/rust/web/mod.rs +2 -0
  185. package/tests/integration.rs +21 -21
  186. package/typescript/core/functions/index.ts +11 -0
  187. package/typescript/pkg/devalang_core.ts +20 -4
  188. package/typescript/scripts/version/copy-to-binary.ts +82 -0
  189. package/rust/cli/bank/api.rs +0 -122
  190. package/rust/cli/bank/commands.rs +0 -275
  191. package/rust/cli/bank/mod.rs +0 -29
  192. package/rust/cli/install/bank.rs +0 -53
  193. package/rust/cli/install/commands.rs +0 -35
  194. package/rust/cli/install/mod.rs +0 -4
  195. package/rust/cli/install/plugin.rs +0 -61
  196. package/rust/core/audio/engine/sample.rs +0 -366
  197. package/rust/core/audio/engine/synth.rs +0 -325
  198. package/rust/core/audio/interpreter/arrow_call.rs +0 -311
  199. package/rust/core/audio/renderer.rs +0 -54
  200. package/rust/core/parser/driver.rs +0 -584
  201. package/rust/core/preprocessor/loader.rs +0 -637
  202. package/rust/core/store/export.rs +0 -28
  203. package/rust/core/store/function.rs +0 -40
  204. package/rust/core/store/import.rs +0 -28
  205. package/rust/core/store/variable.rs +0 -51
  206. package/rust/core/utils/mod.rs +0 -1
  207. package/rust/core/utils/path.rs +0 -37
@@ -1,97 +1,97 @@
1
- #[cfg(feature = "cli")]
2
- use crossterm::style::{Attribute, SetAttribute};
3
-
4
- #[cfg(feature = "cli")]
5
- use std::fmt::Write;
6
-
7
- use crate::logger::{LogLevel, Logger};
8
- use crate::signature::get_signature;
9
- use crate::version::get_version;
10
- use std::env;
11
- use std::path::PathBuf;
12
-
13
- fn get_devalang_homedir() -> PathBuf {
14
- // Prefer explicit env var, then HOME/USERPROFILE, fallback to current dir
15
- if let Ok(p) = env::var("DEVALANG_HOME") {
16
- return PathBuf::from(p);
17
- }
18
-
19
- if let Ok(p) = env::var("HOME") {
20
- return PathBuf::from(p).join(".devalang");
21
- }
22
-
23
- if let Ok(p) = env::var("USERPROFILE") {
24
- return PathBuf::from(p).join(".devalang");
25
- }
26
-
27
- env::current_dir()
28
- .unwrap_or_else(|_| PathBuf::from("."))
29
- .join(".devalang")
30
- }
31
-
32
- pub fn check_is_first_usage() -> bool {
33
- if get_devalang_homedir().exists() == true {
34
- false
35
- } else {
36
- first_usage_welcome();
37
- true
38
- }
39
- }
40
-
41
- pub fn first_usage_welcome() {
42
- std::fs::create_dir_all(get_devalang_homedir()).ok();
43
-
44
- let version = get_version();
45
- print!("{}", get_signature(&version));
46
-
47
- let homedir = get_devalang_homedir().display().to_string();
48
-
49
- let welcome_msg = format!(
50
- "Welcome to Devalang ! \n\
51
- It looks like this is your first time using the tool.\n\
52
- A configuration file will be created in your home directory.\n\
53
- (location: '{}')",
54
- homedir
55
- );
56
-
57
- #[cfg(feature = "cli")]
58
- let mut s = String::new();
59
- #[cfg(feature = "cli")]
60
- {
61
- write!(&mut s, "{}", SetAttribute(Attribute::Bold)).unwrap();
62
- write!(&mut s, "{}", welcome_msg).unwrap();
63
- write!(&mut s, "{}", SetAttribute(Attribute::Reset)).unwrap();
64
-
65
- println!("");
66
- println!("{}", s);
67
- println!("");
68
- }
69
-
70
- #[cfg(not(feature = "cli"))]
71
- {
72
- // Fallback: plain output on non-cli (wasm) builds
73
- println!("");
74
- println!("{}", welcome_msg);
75
- println!("");
76
- }
77
-
78
- first_usage_ask_for_telemetry();
79
- }
80
-
81
- pub fn first_usage_ask_for_telemetry() {
82
- let telemetry_msg = "Would you like to enable anonymous telemetry ?";
83
- let telemetry_desc = "This data helps us improve the tool. You can opt-out at any time.";
84
-
85
- // Non-interactive fallback for first usage: default to telemetry disabled.
86
- let _ = telemetry_msg;
87
- let _ = telemetry_desc;
88
-
89
- let logger = Logger::new();
90
-
91
- println!("");
92
- logger.log_message(
93
- LogLevel::Info,
94
- "Telemetry disabled by default. You can enable it at any time by using 'devalang telemetry enable'"
95
- );
96
- println!("");
97
- }
1
+ #[cfg(feature = "cli")]
2
+ use crossterm::style::{Attribute, SetAttribute};
3
+
4
+ #[cfg(feature = "cli")]
5
+ use std::fmt::Write;
6
+
7
+ use crate::logger::{LogLevel, Logger};
8
+ use crate::signature::get_signature;
9
+ use crate::version::get_version;
10
+ use std::env;
11
+ use std::path::PathBuf;
12
+
13
+ fn get_devalang_homedir() -> PathBuf {
14
+ // Prefer explicit env var, then HOME/USERPROFILE, fallback to current dir
15
+ if let Ok(p) = env::var("DEVALANG_HOME") {
16
+ return PathBuf::from(p);
17
+ }
18
+
19
+ if let Ok(p) = env::var("HOME") {
20
+ return PathBuf::from(p).join(".devalang");
21
+ }
22
+
23
+ if let Ok(p) = env::var("USERPROFILE") {
24
+ return PathBuf::from(p).join(".devalang");
25
+ }
26
+
27
+ env::current_dir()
28
+ .unwrap_or_else(|_| PathBuf::from("."))
29
+ .join(".devalang")
30
+ }
31
+
32
+ pub fn check_is_first_usage() -> bool {
33
+ if get_devalang_homedir().exists() == true {
34
+ false
35
+ } else {
36
+ first_usage_welcome();
37
+ true
38
+ }
39
+ }
40
+
41
+ pub fn first_usage_welcome() {
42
+ std::fs::create_dir_all(get_devalang_homedir()).ok();
43
+
44
+ let version = get_version();
45
+ print!("{}", get_signature(&version));
46
+
47
+ let homedir = get_devalang_homedir().display().to_string();
48
+
49
+ let welcome_msg = format!(
50
+ "Welcome to Devalang ! \n\
51
+ It looks like this is your first time using the tool.\n\
52
+ A configuration file will be created in your home directory.\n\
53
+ (location: '{}')",
54
+ homedir
55
+ );
56
+
57
+ #[cfg(feature = "cli")]
58
+ let mut s = String::new();
59
+ #[cfg(feature = "cli")]
60
+ {
61
+ write!(&mut s, "{}", SetAttribute(Attribute::Bold)).unwrap();
62
+ write!(&mut s, "{}", welcome_msg).unwrap();
63
+ write!(&mut s, "{}", SetAttribute(Attribute::Reset)).unwrap();
64
+
65
+ println!("");
66
+ println!("{}", s);
67
+ println!("");
68
+ }
69
+
70
+ #[cfg(not(feature = "cli"))]
71
+ {
72
+ // Fallback: plain output on non-cli (wasm) builds
73
+ println!("");
74
+ println!("{}", welcome_msg);
75
+ println!("");
76
+ }
77
+
78
+ first_usage_ask_for_telemetry();
79
+ }
80
+
81
+ pub fn first_usage_ask_for_telemetry() {
82
+ let telemetry_msg = "Would you like to enable anonymous telemetry ?";
83
+ let telemetry_desc = "This data helps us improve the tool. You can opt-out at any time.";
84
+
85
+ // Non-interactive fallback for first usage: default to telemetry disabled.
86
+ let _ = telemetry_msg;
87
+ let _ = telemetry_desc;
88
+
89
+ let logger = Logger::new();
90
+
91
+ println!("");
92
+ logger.log_message(
93
+ LogLevel::Info,
94
+ "Telemetry disabled by default. You can enable it at any time by using 'devalang telemetry enable'"
95
+ );
96
+ println!("");
97
+ }
@@ -1,9 +1,9 @@
1
- pub mod error;
2
- pub mod file;
3
- pub mod first_usage;
4
- pub mod logger;
5
- pub mod path;
6
- pub mod signature;
7
- pub mod spinner;
8
- pub mod version;
9
- pub mod watcher;
1
+ pub mod error;
2
+ pub mod file;
3
+ pub mod first_usage;
4
+ pub mod logger;
5
+ pub mod path;
6
+ pub mod signature;
7
+ pub mod spinner;
8
+ pub mod version;
9
+ pub mod watcher;
@@ -1,200 +1,200 @@
1
- #[cfg(feature = "cli")]
2
- use crossterm::style::{Attribute, Color, ResetColor, SetAttribute, SetForegroundColor};
3
- #[cfg(feature = "cli")]
4
- use std::fmt::Write;
5
-
6
- #[derive(Debug, Clone, PartialEq)]
7
- pub enum LogLevel {
8
- Success,
9
- Error,
10
- Info,
11
- Print,
12
- Warning,
13
- Watcher,
14
- Debug,
15
- }
16
-
17
- #[derive(Debug, Clone)]
18
- pub struct Logger;
19
-
20
- impl Logger {
21
- pub fn new() -> Self {
22
- Logger
23
- }
24
-
25
- // Some methods are only used in CLI builds; silence dead_code warnings for non-cli.
26
- #[cfg(not(feature = "cli"))]
27
- #[allow(dead_code)]
28
- fn __wasm_only_allow_dead_code(&self) {}
29
-
30
- // Additionally allow dead_code for the CLI-only formatting helpers when building without cli
31
- #[cfg(not(feature = "cli"))]
32
- #[allow(dead_code)]
33
- fn __wasm_only_format_helpers(&self) {}
34
-
35
- #[cfg(feature = "cli")]
36
- pub fn log_message(&self, level: LogLevel, message: &str) {
37
- let formatted_status = self.format_status(level);
38
- println!(
39
- "🦊 {} {} {}",
40
- self.language_signature(),
41
- formatted_status,
42
- message
43
- );
44
- }
45
-
46
- #[cfg(not(feature = "cli"))]
47
- pub fn log_message(&self, _level: LogLevel, _message: &str) {
48
- // no-op for WASM
49
- }
50
-
51
- #[cfg(feature = "cli")]
52
- pub fn log_message_with_trace(&self, level: LogLevel, message: &str, trace: Vec<&str>) {
53
- let formatted_status = self.format_status(level);
54
- println!(
55
- "🦊 {} {} {}",
56
- self.language_signature(),
57
- formatted_status,
58
- message
59
- );
60
- for t in trace {
61
- println!(" ↳ {}", t);
62
- }
63
- }
64
-
65
- #[cfg(not(feature = "cli"))]
66
- pub fn log_message_with_trace(&self, _level: LogLevel, _message: &str, _trace: Vec<&str>) {
67
- // no-op for WASM
68
- }
69
-
70
- #[cfg(feature = "cli")]
71
- pub fn log_error_with_stacktrace(&self, message: &str, stacktrace: &str) {
72
- let formatted_status = self.format_status(LogLevel::Error);
73
- println!(
74
- "🦊 {} {} {}",
75
- self.language_signature(),
76
- formatted_status,
77
- message
78
- );
79
- println!(" ↳ {}", stacktrace);
80
- }
81
-
82
- #[cfg(not(feature = "cli"))]
83
- pub fn log_error_with_stacktrace(&self, _message: &str, _stacktrace: &str) {
84
- // no-op for WASM
85
- }
86
-
87
- #[cfg(feature = "cli")]
88
- #[allow(dead_code)]
89
- #[cfg_attr(not(feature = "cli"), allow(dead_code))]
90
- fn language_signature(&self) -> String {
91
- let mut s = String::new();
92
-
93
- write!(&mut s, "{}", SetForegroundColor(Color::Grey)).unwrap();
94
- s.push('[');
95
-
96
- write!(
97
- &mut s,
98
- "{}",
99
- SetForegroundColor(Color::Rgb {
100
- r: 29,
101
- g: 211,
102
- b: 176,
103
- })
104
- )
105
- .unwrap();
106
- write!(&mut s, "{}", SetAttribute(Attribute::Bold)).unwrap();
107
- s.push_str("Devalang");
108
- write!(&mut s, "{}", SetAttribute(Attribute::Reset)).unwrap();
109
-
110
- write!(&mut s, "{}", SetForegroundColor(Color::Grey)).unwrap();
111
- s.push(']');
112
- write!(&mut s, "{}", ResetColor).unwrap();
113
-
114
- s
115
- }
116
-
117
- #[cfg(not(feature = "cli"))]
118
- #[allow(dead_code)]
119
- fn language_signature(&self) -> String {
120
- "[Devalang]".to_string()
121
- }
122
-
123
- #[cfg(feature = "cli")]
124
- fn format_status(&self, level: LogLevel) -> String {
125
- let mut s = String::new();
126
-
127
- let color = match level {
128
- LogLevel::Success => Color::Rgb {
129
- r: 76,
130
- g: 175,
131
- b: 80,
132
- },
133
- LogLevel::Error => Color::Rgb {
134
- r: 244,
135
- g: 67,
136
- b: 54,
137
- },
138
- LogLevel::Info => Color::Rgb {
139
- r: 33,
140
- g: 150,
141
- b: 243,
142
- },
143
- LogLevel::Warning => Color::Rgb {
144
- r: 255,
145
- g: 152,
146
- b: 0,
147
- },
148
- LogLevel::Watcher => Color::Rgb {
149
- r: 156,
150
- g: 39,
151
- b: 176,
152
- },
153
- LogLevel::Debug => Color::Rgb {
154
- r: 103,
155
- g: 58,
156
- b: 183,
157
- },
158
- LogLevel::Print => Color::Rgb {
159
- r: 255,
160
- g: 255,
161
- b: 255,
162
- },
163
- };
164
-
165
- let status = match level {
166
- LogLevel::Success => "SUCCESS",
167
- LogLevel::Error => "ERROR",
168
- LogLevel::Info => "INFO",
169
- LogLevel::Warning => "WARNING",
170
- LogLevel::Watcher => "WATCHER",
171
- LogLevel::Debug => "DEBUG",
172
- LogLevel::Print => "PRINT",
173
- };
174
-
175
- s.push('[');
176
- write!(&mut s, "{}", SetForegroundColor(color)).unwrap();
177
- write!(&mut s, "{}", SetAttribute(Attribute::Bold)).unwrap();
178
- s.push_str(status);
179
- write!(&mut s, "{}", SetAttribute(Attribute::Reset)).unwrap();
180
- s.push(']');
181
- write!(&mut s, "{}", ResetColor).unwrap();
182
-
183
- s
184
- }
185
-
186
- #[cfg(not(feature = "cli"))]
187
- #[allow(dead_code)]
188
- fn format_status(&self, level: LogLevel) -> String {
189
- (match level {
190
- LogLevel::Success => "[SUCCESS]",
191
- LogLevel::Error => "[ERROR]",
192
- LogLevel::Info => "[INFO]",
193
- LogLevel::Warning => "[WARNING]",
194
- LogLevel::Watcher => "[WATCHER]",
195
- LogLevel::Debug => "[DEBUG]",
196
- LogLevel::Print => "[PRINT]",
197
- })
198
- .to_string()
199
- }
200
- }
1
+ #[cfg(feature = "cli")]
2
+ use crossterm::style::{Attribute, Color, ResetColor, SetAttribute, SetForegroundColor};
3
+ #[cfg(feature = "cli")]
4
+ use std::fmt::Write;
5
+
6
+ #[derive(Debug, Clone, PartialEq)]
7
+ pub enum LogLevel {
8
+ Success,
9
+ Error,
10
+ Info,
11
+ Print,
12
+ Warning,
13
+ Watcher,
14
+ Debug,
15
+ }
16
+
17
+ #[derive(Debug, Clone)]
18
+ pub struct Logger;
19
+
20
+ impl Logger {
21
+ pub fn new() -> Self {
22
+ Logger
23
+ }
24
+
25
+ // Some methods are only used in CLI builds; silence dead_code warnings for non-cli.
26
+ #[cfg(not(feature = "cli"))]
27
+ #[allow(dead_code)]
28
+ fn __wasm_only_allow_dead_code(&self) {}
29
+
30
+ // Additionally allow dead_code for the CLI-only formatting helpers when building without cli
31
+ #[cfg(not(feature = "cli"))]
32
+ #[allow(dead_code)]
33
+ fn __wasm_only_format_helpers(&self) {}
34
+
35
+ #[cfg(feature = "cli")]
36
+ pub fn log_message(&self, level: LogLevel, message: &str) {
37
+ let formatted_status = self.format_status(level);
38
+ println!(
39
+ "🦊 {} {} {}",
40
+ self.language_signature(),
41
+ formatted_status,
42
+ message
43
+ );
44
+ }
45
+
46
+ #[cfg(not(feature = "cli"))]
47
+ pub fn log_message(&self, _level: LogLevel, _message: &str) {
48
+ // no-op for WASM
49
+ }
50
+
51
+ #[cfg(feature = "cli")]
52
+ pub fn log_message_with_trace(&self, level: LogLevel, message: &str, trace: Vec<&str>) {
53
+ let formatted_status = self.format_status(level);
54
+ println!(
55
+ "🦊 {} {} {}",
56
+ self.language_signature(),
57
+ formatted_status,
58
+ message
59
+ );
60
+ for t in trace {
61
+ println!(" ↳ {}", t);
62
+ }
63
+ }
64
+
65
+ #[cfg(not(feature = "cli"))]
66
+ pub fn log_message_with_trace(&self, _level: LogLevel, _message: &str, _trace: Vec<&str>) {
67
+ // no-op for WASM
68
+ }
69
+
70
+ #[cfg(feature = "cli")]
71
+ pub fn log_error_with_stacktrace(&self, message: &str, stacktrace: &str) {
72
+ let formatted_status = self.format_status(LogLevel::Error);
73
+ println!(
74
+ "🦊 {} {} {}",
75
+ self.language_signature(),
76
+ formatted_status,
77
+ message
78
+ );
79
+ println!(" ↳ {}", stacktrace);
80
+ }
81
+
82
+ #[cfg(not(feature = "cli"))]
83
+ pub fn log_error_with_stacktrace(&self, _message: &str, _stacktrace: &str) {
84
+ // no-op for WASM
85
+ }
86
+
87
+ #[cfg(feature = "cli")]
88
+ #[allow(dead_code)]
89
+ #[cfg_attr(not(feature = "cli"), allow(dead_code))]
90
+ fn language_signature(&self) -> String {
91
+ let mut s = String::new();
92
+
93
+ write!(&mut s, "{}", SetForegroundColor(Color::Grey)).unwrap();
94
+ s.push('[');
95
+
96
+ write!(
97
+ &mut s,
98
+ "{}",
99
+ SetForegroundColor(Color::Rgb {
100
+ r: 29,
101
+ g: 211,
102
+ b: 176,
103
+ })
104
+ )
105
+ .unwrap();
106
+ write!(&mut s, "{}", SetAttribute(Attribute::Bold)).unwrap();
107
+ s.push_str("Devalang");
108
+ write!(&mut s, "{}", SetAttribute(Attribute::Reset)).unwrap();
109
+
110
+ write!(&mut s, "{}", SetForegroundColor(Color::Grey)).unwrap();
111
+ s.push(']');
112
+ write!(&mut s, "{}", ResetColor).unwrap();
113
+
114
+ s
115
+ }
116
+
117
+ #[cfg(not(feature = "cli"))]
118
+ #[allow(dead_code)]
119
+ fn language_signature(&self) -> String {
120
+ "[Devalang]".to_string()
121
+ }
122
+
123
+ #[cfg(feature = "cli")]
124
+ fn format_status(&self, level: LogLevel) -> String {
125
+ let mut s = String::new();
126
+
127
+ let color = match level {
128
+ LogLevel::Success => Color::Rgb {
129
+ r: 76,
130
+ g: 175,
131
+ b: 80,
132
+ },
133
+ LogLevel::Error => Color::Rgb {
134
+ r: 244,
135
+ g: 67,
136
+ b: 54,
137
+ },
138
+ LogLevel::Info => Color::Rgb {
139
+ r: 33,
140
+ g: 150,
141
+ b: 243,
142
+ },
143
+ LogLevel::Warning => Color::Rgb {
144
+ r: 255,
145
+ g: 152,
146
+ b: 0,
147
+ },
148
+ LogLevel::Watcher => Color::Rgb {
149
+ r: 156,
150
+ g: 39,
151
+ b: 176,
152
+ },
153
+ LogLevel::Debug => Color::Rgb {
154
+ r: 103,
155
+ g: 58,
156
+ b: 183,
157
+ },
158
+ LogLevel::Print => Color::Rgb {
159
+ r: 255,
160
+ g: 255,
161
+ b: 255,
162
+ },
163
+ };
164
+
165
+ let status = match level {
166
+ LogLevel::Success => "SUCCESS",
167
+ LogLevel::Error => "ERROR",
168
+ LogLevel::Info => "INFO",
169
+ LogLevel::Warning => "WARNING",
170
+ LogLevel::Watcher => "WATCHER",
171
+ LogLevel::Debug => "DEBUG",
172
+ LogLevel::Print => "PRINT",
173
+ };
174
+
175
+ s.push('[');
176
+ write!(&mut s, "{}", SetForegroundColor(color)).unwrap();
177
+ write!(&mut s, "{}", SetAttribute(Attribute::Bold)).unwrap();
178
+ s.push_str(status);
179
+ write!(&mut s, "{}", SetAttribute(Attribute::Reset)).unwrap();
180
+ s.push(']');
181
+ write!(&mut s, "{}", ResetColor).unwrap();
182
+
183
+ s
184
+ }
185
+
186
+ #[cfg(not(feature = "cli"))]
187
+ #[allow(dead_code)]
188
+ fn format_status(&self, level: LogLevel) -> String {
189
+ (match level {
190
+ LogLevel::Success => "[SUCCESS]",
191
+ LogLevel::Error => "[ERROR]",
192
+ LogLevel::Info => "[INFO]",
193
+ LogLevel::Warning => "[WARNING]",
194
+ LogLevel::Watcher => "[WATCHER]",
195
+ LogLevel::Debug => "[DEBUG]",
196
+ LogLevel::Print => "[PRINT]",
197
+ })
198
+ .to_string()
199
+ }
200
+ }