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

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 (220) hide show
  1. package/.devalang +9 -10
  2. package/Cargo.toml +5 -4
  3. package/README.md +7 -5
  4. package/docs/CHANGELOG.md +42 -0
  5. package/docs/ROADMAP.md +5 -1
  6. package/docs/TODO.md +3 -14
  7. package/examples/bus.deva +10 -0
  8. package/examples/effect.deva +2 -0
  9. package/examples/filter.deva +11 -0
  10. package/examples/lfo.deva +9 -0
  11. package/examples/synth.deva +11 -1
  12. package/examples/synth_types.deva +17 -0
  13. package/out-tsc/core/functions/index.d.ts +5 -0
  14. package/out-tsc/core/functions/index.js +11 -0
  15. package/out-tsc/pkg/devalang_core.d.ts +2 -0
  16. package/out-tsc/pkg/devalang_core.js +17 -2
  17. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +8 -7
  18. package/package.json +1 -1
  19. package/project-version.json +3 -3
  20. package/rust/cli/bank/api.rs +122 -122
  21. package/rust/cli/bank/commands.rs +33 -2
  22. package/rust/cli/bank/mod.rs +29 -29
  23. package/rust/cli/build/commands.rs +53 -3
  24. package/rust/cli/build/mod.rs +2 -2
  25. package/rust/cli/build/process.rs +26 -7
  26. package/rust/cli/check/mod.rs +2 -2
  27. package/rust/cli/discover/commands.rs +253 -253
  28. package/rust/cli/discover/config.rs +111 -111
  29. package/rust/cli/discover/fs.rs +19 -19
  30. package/rust/cli/discover/install.rs +103 -103
  31. package/rust/cli/discover/metadata.rs +48 -48
  32. package/rust/cli/discover/mod.rs +5 -5
  33. package/rust/cli/install/addon.rs +118 -118
  34. package/rust/cli/install/bank.rs +22 -3
  35. package/rust/cli/install/commands.rs +35 -35
  36. package/rust/cli/install/mod.rs +4 -4
  37. package/rust/cli/install/plugin.rs +80 -61
  38. package/rust/cli/login/commands.rs +124 -124
  39. package/rust/cli/mod.rs +12 -12
  40. package/rust/cli/parser.rs +46 -1
  41. package/rust/cli/play/commands.rs +71 -20
  42. package/rust/cli/play/mod.rs +5 -5
  43. package/rust/cli/play/process.rs +14 -5
  44. package/rust/cli/play/realtime.rs +91 -91
  45. package/rust/cli/telemetry/commands.rs +22 -22
  46. package/rust/cli/telemetry/event_creator.rs +80 -80
  47. package/rust/cli/telemetry/mod.rs +3 -3
  48. package/rust/cli/telemetry/send.rs +51 -51
  49. package/rust/cli/template/commands.rs +69 -69
  50. package/rust/config/driver.rs +112 -103
  51. package/rust/config/mod.rs +3 -3
  52. package/rust/config/ops.rs +26 -26
  53. package/rust/config/settings.rs +101 -101
  54. package/rust/core/audio/engine/driver.rs +220 -0
  55. package/rust/core/audio/engine/export.rs +169 -0
  56. package/rust/core/audio/engine/helpers.rs +178 -170
  57. package/rust/core/audio/engine/mod.rs +51 -2
  58. package/rust/core/audio/engine/notes/dsp.rs +85 -0
  59. package/rust/core/audio/engine/notes/mod.rs +44 -0
  60. package/rust/core/audio/engine/notes/params.rs +294 -0
  61. package/rust/core/audio/engine/sample/insert.rs +199 -0
  62. package/rust/core/audio/engine/sample/mod.rs +40 -0
  63. package/rust/core/audio/engine/sample/padding.rs +170 -0
  64. package/rust/core/audio/evaluator/condition.rs +61 -0
  65. package/rust/core/audio/evaluator/mod.rs +9 -0
  66. package/rust/core/audio/{evaluator.rs → evaluator/numeric.rs} +1 -159
  67. package/rust/core/audio/evaluator/rhs.rs +16 -0
  68. package/rust/core/audio/evaluator/string_expr.rs +94 -0
  69. package/rust/core/audio/interpreter/driver.rs +55 -23
  70. package/rust/core/audio/interpreter/mod.rs +1 -13
  71. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +175 -0
  72. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +384 -0
  73. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +2 -0
  74. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +316 -0
  75. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +3 -0
  76. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +192 -0
  77. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +24 -0
  78. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +116 -0
  79. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +97 -0
  80. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +100 -0
  81. package/rust/core/audio/interpreter/{automate.rs → statements/automate.rs} +16 -18
  82. package/rust/core/audio/interpreter/{call.rs → statements/call.rs} +5 -4
  83. package/rust/core/audio/interpreter/{condition.rs → statements/condition.rs} +2 -1
  84. package/rust/core/audio/interpreter/{function.rs → statements/function.rs} +2 -4
  85. package/rust/core/audio/interpreter/{let_.rs → statements/let_.rs} +2 -4
  86. package/rust/core/audio/interpreter/{load.rs → statements/load.rs} +2 -4
  87. package/rust/core/audio/interpreter/{loop_.rs → statements/loop_.rs} +2 -1
  88. package/rust/core/audio/interpreter/statements/mod.rs +12 -0
  89. package/rust/core/audio/interpreter/{sleep.rs → statements/sleep.rs} +28 -28
  90. package/rust/core/audio/interpreter/{spawn.rs → statements/spawn.rs} +3 -2
  91. package/rust/core/audio/interpreter/{tempo.rs → statements/tempo.rs} +40 -40
  92. package/rust/core/audio/interpreter/{trigger.rs → statements/trigger.rs} +1 -1
  93. package/rust/core/audio/loader/trigger.rs +2 -1
  94. package/rust/core/audio/mod.rs +6 -7
  95. package/rust/core/audio/player.rs +70 -70
  96. package/rust/core/audio/special/easing.rs +189 -189
  97. package/rust/core/audio/special/env.rs +45 -45
  98. package/rust/core/audio/special/math.rs +134 -134
  99. package/rust/core/audio/special/mod.rs +9 -9
  100. package/rust/core/audio/special/modulator.rs +143 -143
  101. package/rust/core/builder/mod.rs +45 -2
  102. package/rust/core/debugger/lexer.rs +27 -27
  103. package/rust/core/debugger/{module.rs → logs.rs} +3 -6
  104. package/rust/core/debugger/mod.rs +30 -30
  105. package/rust/core/debugger/preprocessor.rs +27 -27
  106. package/rust/core/debugger/store.rs +2 -4
  107. package/rust/core/error/mod.rs +269 -269
  108. package/rust/core/lexer/driver.rs +59 -61
  109. package/rust/core/lexer/handler/arrow.rs +82 -82
  110. package/rust/core/lexer/handler/at.rs +21 -21
  111. package/rust/core/lexer/handler/brace.rs +41 -41
  112. package/rust/core/lexer/handler/colon.rs +21 -21
  113. package/rust/core/lexer/handler/comment.rs +30 -30
  114. package/rust/core/lexer/handler/dot.rs +21 -21
  115. package/rust/core/lexer/handler/driver.rs +337 -337
  116. package/rust/core/lexer/handler/identifier.rs +47 -47
  117. package/rust/core/lexer/handler/indent.rs +66 -66
  118. package/rust/core/lexer/handler/mod.rs +15 -15
  119. package/rust/core/lexer/handler/newline.rs +23 -23
  120. package/rust/core/lexer/handler/number.rs +31 -31
  121. package/rust/core/lexer/handler/operator.rs +46 -46
  122. package/rust/core/lexer/handler/parenthesis.rs +41 -41
  123. package/rust/core/lexer/handler/slash.rs +21 -21
  124. package/rust/core/lexer/handler/string.rs +63 -63
  125. package/rust/core/lexer/mod.rs +3 -3
  126. package/rust/core/mod.rs +0 -1
  127. package/rust/core/parser/driver/block.rs +111 -0
  128. package/rust/core/parser/driver/cursor.rs +82 -0
  129. package/rust/core/parser/driver/driver_impl.rs +139 -0
  130. package/rust/core/parser/driver/mod.rs +6 -0
  131. package/rust/core/parser/driver/parse_array.rs +120 -0
  132. package/rust/core/parser/driver/parse_map.rs +223 -0
  133. package/rust/core/parser/driver/parser.rs +160 -0
  134. package/rust/core/parser/handler/arrow_call.rs +28 -4
  135. package/rust/core/parser/handler/at.rs +279 -279
  136. package/rust/core/parser/handler/bank.rs +104 -104
  137. package/rust/core/parser/handler/condition.rs +83 -83
  138. package/rust/core/parser/handler/dot.rs +148 -148
  139. package/rust/core/parser/handler/identifier/automate.rs +254 -254
  140. package/rust/core/parser/handler/identifier/call.rs +91 -91
  141. package/rust/core/parser/handler/identifier/emit.rs +70 -70
  142. package/rust/core/parser/handler/identifier/function.rs +113 -113
  143. package/rust/core/parser/handler/identifier/group.rs +89 -89
  144. package/rust/core/parser/handler/identifier/let_.rs +173 -173
  145. package/rust/core/parser/handler/identifier/mod.rs +55 -55
  146. package/rust/core/parser/handler/identifier/on.rs +107 -107
  147. package/rust/core/parser/handler/identifier/print.rs +49 -49
  148. package/rust/core/parser/handler/identifier/sleep.rs +96 -43
  149. package/rust/core/parser/handler/identifier/spawn.rs +91 -91
  150. package/rust/core/parser/handler/identifier/synth.rs +135 -135
  151. package/rust/core/parser/handler/loop_.rs +194 -194
  152. package/rust/core/parser/handler/mod.rs +9 -9
  153. package/rust/core/parser/handler/pattern.rs +1 -1
  154. package/rust/core/parser/handler/tempo.rs +105 -57
  155. package/rust/core/parser/statement.rs +10 -11
  156. package/rust/core/plugin/loader.rs +1 -1
  157. package/rust/core/plugin/mod.rs +2 -2
  158. package/rust/core/plugin/runner/mod.rs +11 -0
  159. package/rust/core/plugin/{runner.rs → runner/non_wasm.rs} +297 -347
  160. package/rust/core/plugin/runner/wasm32.rs +43 -0
  161. package/rust/core/preprocessor/loader/inject.rs +278 -0
  162. package/rust/core/preprocessor/loader/loader_helpers.rs +110 -0
  163. package/rust/core/preprocessor/loader/mod.rs +235 -0
  164. package/rust/core/preprocessor/module.rs +2 -7
  165. package/rust/core/preprocessor/{processor.rs → processor/handlers.rs} +6 -13
  166. package/rust/core/preprocessor/processor/mod.rs +1 -0
  167. package/rust/core/preprocessor/resolver/bank.rs +49 -49
  168. package/rust/core/preprocessor/resolver/call.rs +124 -124
  169. package/rust/core/preprocessor/resolver/condition.rs +95 -95
  170. package/rust/core/preprocessor/resolver/driver.rs +324 -324
  171. package/rust/core/preprocessor/resolver/function.rs +2 -2
  172. package/rust/core/preprocessor/resolver/group.rs +46 -18
  173. package/rust/core/preprocessor/resolver/let_.rs +32 -32
  174. package/rust/core/preprocessor/resolver/loop_.rs +318 -318
  175. package/rust/core/preprocessor/resolver/mod.rs +16 -16
  176. package/rust/core/preprocessor/resolver/pattern.rs +83 -83
  177. package/rust/core/preprocessor/resolver/spawn.rs +99 -99
  178. package/rust/core/preprocessor/resolver/synth.rs +54 -54
  179. package/rust/core/preprocessor/resolver/tempo.rs +48 -48
  180. package/rust/core/preprocessor/resolver/trigger.rs +116 -116
  181. package/rust/core/preprocessor/resolver/value.rs +176 -176
  182. package/rust/core/store/global.rs +2 -6
  183. package/rust/core/store/mod.rs +1 -5
  184. package/rust/lib.rs +18 -3
  185. package/rust/main.rs +27 -3
  186. package/rust/types/Cargo.toml +1 -1
  187. package/rust/types/src/addons.rs +55 -55
  188. package/rust/types/src/config.rs +84 -74
  189. package/rust/types/src/lib.rs +15 -12
  190. package/rust/types/src/plugin.rs +20 -0
  191. package/rust/types/src/store.rs +139 -0
  192. package/rust/types/src/telemetry.rs +85 -85
  193. package/rust/utils/Cargo.toml +2 -2
  194. package/rust/utils/src/file.rs +94 -94
  195. package/rust/utils/src/first_usage.rs +97 -97
  196. package/rust/utils/src/lib.rs +9 -9
  197. package/rust/utils/src/logger.rs +200 -200
  198. package/rust/utils/src/path.rs +129 -88
  199. package/rust/utils/src/signature.rs +41 -41
  200. package/rust/utils/src/spinner.rs +20 -20
  201. package/rust/utils/src/version.rs +27 -27
  202. package/rust/utils/src/watcher.rs +46 -46
  203. package/rust/web/api.rs +5 -5
  204. package/rust/web/cdn.rs +34 -34
  205. package/rust/web/mod.rs +3 -3
  206. package/tests/integration.rs +21 -21
  207. package/typescript/core/functions/index.ts +11 -0
  208. package/typescript/pkg/devalang_core.ts +20 -4
  209. package/rust/core/audio/engine/sample.rs +0 -366
  210. package/rust/core/audio/engine/synth.rs +0 -325
  211. package/rust/core/audio/interpreter/arrow_call.rs +0 -311
  212. package/rust/core/audio/renderer.rs +0 -54
  213. package/rust/core/parser/driver.rs +0 -584
  214. package/rust/core/preprocessor/loader.rs +0 -637
  215. package/rust/core/store/export.rs +0 -28
  216. package/rust/core/store/function.rs +0 -40
  217. package/rust/core/store/import.rs +0 -28
  218. package/rust/core/store/variable.rs +0 -51
  219. package/rust/core/utils/mod.rs +0 -1
  220. package/rust/core/utils/path.rs +0 -37
@@ -1,103 +1,112 @@
1
- use devalang_types::{
2
- PluginEntry as SharedPluginEntry, ProjectConfig as SharedProjectConfig,
3
- ProjectConfigBankEntry as SharedProjectConfigBankEntry,
4
- ProjectConfigDefaults as SharedProjectConfigDefaults,
5
- ProjectConfigPluginEntry as SharedProjectConfigPluginEntry,
6
- };
7
- use devalang_utils::path as path_utils;
8
- use std::path::PathBuf;
9
-
10
- pub type ProjectConfig = SharedProjectConfig;
11
- pub type ProjectConfigDefaults = SharedProjectConfigDefaults;
12
- pub type ProjectConfigBankEntry = SharedProjectConfigBankEntry;
13
- pub type ProjectConfigPluginEntry = SharedProjectConfigPluginEntry;
14
- pub type PluginEntry = SharedPluginEntry;
15
-
16
- pub trait ProjectConfigExt {
17
- fn new_config() -> Self;
18
- fn with_defaults(
19
- entry: Option<String>,
20
- output: Option<String>,
21
- watch: Option<bool>,
22
- repeat: Option<bool>,
23
- debug: Option<bool>,
24
- compress: Option<bool>,
25
- ) -> Self;
26
- fn get() -> Result<Self, String>
27
- where
28
- Self: Sized;
29
- fn from_string(config_string: &str) -> Result<(Self, String), String>
30
- where
31
- Self: Sized;
32
- fn write_config(&self, new_config: &Self) -> Result<(), String>
33
- where
34
- Self: Sized;
35
- }
36
-
37
- impl ProjectConfigExt for SharedProjectConfig {
38
- fn new_config() -> Self {
39
- SharedProjectConfig::default()
40
- }
41
-
42
- fn with_defaults(
43
- entry: Option<String>,
44
- output: Option<String>,
45
- watch: Option<bool>,
46
- repeat: Option<bool>,
47
- debug: Option<bool>,
48
- compress: Option<bool>,
49
- ) -> Self {
50
- SharedProjectConfig {
51
- defaults: SharedProjectConfigDefaults {
52
- entry,
53
- output,
54
- watch,
55
- repeat,
56
- debug,
57
- compress,
58
- },
59
- banks: Some(Vec::new()),
60
- plugins: Some(Vec::new()),
61
- }
62
- }
63
-
64
- fn get() -> Result<Self, String> {
65
- let config_path = path_utils::get_devalang_config_path()?;
66
-
67
- let config_content = std::fs::read_to_string(&config_path)
68
- .map_err(|e| format!("Failed to read config file: {}", e))?;
69
-
70
- let config: SharedProjectConfig = toml::from_str(&config_content)
71
- .map_err(|e| format!("Failed to parse config file: {}", e))?;
72
-
73
- Ok(config)
74
- }
75
-
76
- fn from_string(config_string: &str) -> Result<(Self, String), String> {
77
- let config: SharedProjectConfig = toml::from_str(config_string)
78
- .map_err(|e| format!("Failed to parse config string: {}", e))?;
79
- let config_path = ".devalang".to_string();
80
-
81
- Ok((config, config_path))
82
- }
83
-
84
- fn write_config(&self, new_config: &Self) -> Result<(), String> {
85
- let config_path: PathBuf = match path_utils::get_project_root() {
86
- Ok(root) => root.join(path_utils::DEVALANG_CONFIG),
87
- Err(_) => PathBuf::from(path_utils::DEVALANG_CONFIG),
88
- };
89
-
90
- let content = toml::to_string(new_config)
91
- .map_err(|e| format!("Failed to serialize config: {}", e))?;
92
-
93
- std::fs::write(&config_path, content).map_err(|e| {
94
- format!(
95
- "Failed to write config to file '{}': {}",
96
- config_path.display(),
97
- e
98
- )
99
- })?;
100
-
101
- Ok(())
102
- }
103
- }
1
+ use devalang_types::{
2
+ PluginEntry as SharedPluginEntry, ProjectConfig as SharedProjectConfig,
3
+ ProjectConfigBankEntry as SharedProjectConfigBankEntry,
4
+ ProjectConfigDefaults as SharedProjectConfigDefaults,
5
+ ProjectConfigPluginEntry as SharedProjectConfigPluginEntry,
6
+ };
7
+ use devalang_utils::path as path_utils;
8
+ use std::path::PathBuf;
9
+
10
+ pub type ProjectConfig = SharedProjectConfig;
11
+ pub type ProjectConfigDefaults = SharedProjectConfigDefaults;
12
+ pub type ProjectConfigBankEntry = SharedProjectConfigBankEntry;
13
+ pub type ProjectConfigPluginEntry = SharedProjectConfigPluginEntry;
14
+ pub type PluginEntry = SharedPluginEntry;
15
+
16
+ pub trait ProjectConfigExt {
17
+ fn new_config() -> Self;
18
+ fn with_defaults(
19
+ entry: Option<String>,
20
+ output: Option<String>,
21
+ watch: Option<bool>,
22
+ repeat: Option<bool>,
23
+ debug: Option<bool>,
24
+ compress: Option<bool>,
25
+ sample_rate: Option<u32>,
26
+ audio_format: Option<String>,
27
+ output_format: Option<Vec<String>>,
28
+ ) -> Self;
29
+ fn get() -> Result<Self, String>
30
+ where
31
+ Self: Sized;
32
+ fn from_string(config_string: &str) -> Result<(Self, String), String>
33
+ where
34
+ Self: Sized;
35
+ fn write_config(&self, new_config: &Self) -> Result<(), String>
36
+ where
37
+ Self: Sized;
38
+ }
39
+
40
+ impl ProjectConfigExt for SharedProjectConfig {
41
+ fn new_config() -> Self {
42
+ SharedProjectConfig::default()
43
+ }
44
+
45
+ fn with_defaults(
46
+ entry: Option<String>,
47
+ output: Option<String>,
48
+ watch: Option<bool>,
49
+ repeat: Option<bool>,
50
+ debug: Option<bool>,
51
+ compress: Option<bool>,
52
+ sample_rate: Option<u32>,
53
+ audio_format: Option<String>,
54
+ output_format: Option<Vec<String>>,
55
+ ) -> Self {
56
+ SharedProjectConfig {
57
+ defaults: SharedProjectConfigDefaults {
58
+ entry,
59
+ output,
60
+ watch,
61
+ repeat,
62
+ debug,
63
+ compress,
64
+ sample_rate,
65
+ audio_format,
66
+ output_format,
67
+ },
68
+ banks: Some(Vec::new()),
69
+ plugins: Some(Vec::new()),
70
+ }
71
+ }
72
+
73
+ fn get() -> Result<Self, String> {
74
+ let config_path = path_utils::get_devalang_config_path()?;
75
+
76
+ let config_content = std::fs::read_to_string(&config_path)
77
+ .map_err(|e| format!("Failed to read config file: {}", e))?;
78
+
79
+ let config: SharedProjectConfig = toml::from_str(&config_content)
80
+ .map_err(|e| format!("Failed to parse config file: {}", e))?;
81
+
82
+ Ok(config)
83
+ }
84
+
85
+ fn from_string(config_string: &str) -> Result<(Self, String), String> {
86
+ let config: SharedProjectConfig = toml::from_str(config_string)
87
+ .map_err(|e| format!("Failed to parse config string: {}", e))?;
88
+ let config_path = ".devalang".to_string();
89
+
90
+ Ok((config, config_path))
91
+ }
92
+
93
+ fn write_config(&self, new_config: &Self) -> Result<(), String> {
94
+ let config_path: PathBuf = match path_utils::get_project_root() {
95
+ Ok(root) => root.join(path_utils::DEVALANG_CONFIG),
96
+ Err(_) => PathBuf::from(path_utils::DEVALANG_CONFIG),
97
+ };
98
+
99
+ let content = toml::to_string(new_config)
100
+ .map_err(|e| format!("Failed to serialize config: {}", e))?;
101
+
102
+ std::fs::write(&config_path, content).map_err(|e| {
103
+ format!(
104
+ "Failed to write config to file '{}': {}",
105
+ config_path.display(),
106
+ e
107
+ )
108
+ })?;
109
+
110
+ Ok(())
111
+ }
112
+ }
@@ -1,3 +1,3 @@
1
- pub mod driver;
2
- pub mod ops;
3
- pub mod settings;
1
+ pub mod driver;
2
+ pub mod ops;
3
+ pub mod settings;
@@ -1,26 +1,26 @@
1
- use crate::config::driver::ProjectConfig;
2
- use std::fs;
3
- use std::path::Path;
4
-
5
- pub fn load_config(path: Option<&Path>) -> Option<ProjectConfig> {
6
- let config_path_buf;
7
- let config_path = match path {
8
- Some(p) => p,
9
- None => {
10
- config_path_buf = match devalang_utils::path::get_devalang_config_path() {
11
- Ok(p) => p,
12
- Err(_) => {
13
- return None;
14
- }
15
- };
16
- &config_path_buf
17
- }
18
- };
19
-
20
- if config_path.exists() {
21
- let content = fs::read_to_string(config_path).ok()?;
22
- toml::from_str(&content).ok()
23
- } else {
24
- None
25
- }
26
- }
1
+ use crate::config::driver::ProjectConfig;
2
+ use std::fs;
3
+ use std::path::Path;
4
+
5
+ pub fn load_config(path: Option<&Path>) -> Option<ProjectConfig> {
6
+ let config_path_buf;
7
+ let config_path = match path {
8
+ Some(p) => p,
9
+ None => {
10
+ config_path_buf = match devalang_utils::path::get_devalang_config_path() {
11
+ Ok(p) => p,
12
+ Err(_) => {
13
+ return None;
14
+ }
15
+ };
16
+ &config_path_buf
17
+ }
18
+ };
19
+
20
+ if config_path.exists() {
21
+ let content = fs::read_to_string(config_path).ok()?;
22
+ toml::from_str(&content).ok()
23
+ } else {
24
+ None
25
+ }
26
+ }
@@ -1,101 +1,101 @@
1
- use devalang_types::{TelemetrySettings, UserSettings};
2
- use serde_json::Value as JsonValue;
3
- use std::io::Write;
4
-
5
- pub fn get_home_dir() -> Option<std::path::PathBuf> {
6
- dirs::home_dir()
7
- }
8
-
9
- pub fn get_devalang_homedir() -> std::path::PathBuf {
10
- if let Some(home_dir) = get_home_dir() {
11
- home_dir.join(".devalang")
12
- } else {
13
- std::path::PathBuf::from("~/.devalang")
14
- }
15
- }
16
-
17
- pub fn get_default_user_config() -> UserSettings {
18
- UserSettings {
19
- session: "".into(),
20
- telemetry: TelemetrySettings {
21
- uuid: uuid::Uuid::new_v4().to_string(),
22
- enabled: false,
23
- level: "basic".into(),
24
- stats: false,
25
- },
26
- }
27
- }
28
-
29
- pub fn get_user_config() -> Option<UserSettings> {
30
- if let Some(config_path) = get_devalang_homedir().join("config.json").into() {
31
- let file = std::fs::File::open(config_path).ok()?;
32
- let settings = serde_json::from_reader(file).ok()?;
33
- Some(settings)
34
- } else {
35
- None
36
- }
37
- }
38
-
39
- pub fn write_user_config_file() {
40
- if let Some(config_path) = get_devalang_homedir().join("config.json").into() {
41
- let settings = get_user_config().unwrap_or_else(get_default_user_config);
42
-
43
- let config_json = serde_json::to_string(&settings).unwrap();
44
-
45
- if let Err(e) = write_config_atomic(&config_path, &config_json) {
46
- println!("Could not write config file: {}", e);
47
- }
48
- } else {
49
- println!("Could not create config file");
50
- }
51
- }
52
-
53
- pub fn ensure_user_config_file_exists() {
54
- if let Some(config_path) = get_devalang_homedir().join("config.json").into() {
55
- if !config_path.exists() {
56
- write_user_config_file();
57
- }
58
- }
59
- }
60
-
61
- pub fn set_user_config_value(key: &str, value: JsonValue) {
62
- let mut settings = get_user_config().unwrap_or_default();
63
-
64
- match (key, &value) {
65
- ("telemetry", JsonValue::Bool(b)) => {
66
- settings.telemetry.enabled = *b;
67
- }
68
- ("session", JsonValue::String(s)) => {
69
- settings.session = s.clone();
70
- }
71
- _ => {
72
- println!("Unsupported key or value type for '{}': {:?}", key, value);
73
- }
74
- }
75
-
76
- if let Some(config_path) = get_devalang_homedir().join("config.json").into() {
77
- let config_json = serde_json::to_string(&settings).unwrap();
78
- if let Err(e) = write_config_atomic(&config_path, &config_json) {
79
- println!("Could not write config file: {}", e);
80
- }
81
- } else {
82
- println!("Could not create config file");
83
- }
84
- }
85
-
86
- pub fn write_config_atomic(
87
- config_path: &std::path::PathBuf,
88
- contents: &str,
89
- ) -> std::io::Result<()> {
90
- if let Some(parent) = config_path.parent() {
91
- std::fs::create_dir_all(parent)?;
92
- }
93
-
94
- let tmp_path = config_path.with_extension("json.tmp");
95
- let mut tmp_file = std::fs::File::create(&tmp_path)?;
96
- tmp_file.write_all(contents.as_bytes())?;
97
- tmp_file.sync_all()?;
98
- std::fs::rename(&tmp_path, config_path)?;
99
-
100
- Ok(())
101
- }
1
+ use devalang_types::{TelemetrySettings, UserSettings};
2
+ use serde_json::Value as JsonValue;
3
+ use std::io::Write;
4
+
5
+ pub fn get_home_dir() -> Option<std::path::PathBuf> {
6
+ dirs::home_dir()
7
+ }
8
+
9
+ pub fn get_devalang_homedir() -> std::path::PathBuf {
10
+ if let Some(home_dir) = get_home_dir() {
11
+ home_dir.join(".devalang")
12
+ } else {
13
+ std::path::PathBuf::from("~/.devalang")
14
+ }
15
+ }
16
+
17
+ pub fn get_default_user_config() -> UserSettings {
18
+ UserSettings {
19
+ session: "".into(),
20
+ telemetry: TelemetrySettings {
21
+ uuid: uuid::Uuid::new_v4().to_string(),
22
+ enabled: false,
23
+ level: "basic".into(),
24
+ stats: false,
25
+ },
26
+ }
27
+ }
28
+
29
+ pub fn get_user_config() -> Option<UserSettings> {
30
+ if let Some(config_path) = get_devalang_homedir().join("config.json").into() {
31
+ let file = std::fs::File::open(config_path).ok()?;
32
+ let settings = serde_json::from_reader(file).ok()?;
33
+ Some(settings)
34
+ } else {
35
+ None
36
+ }
37
+ }
38
+
39
+ pub fn write_user_config_file() {
40
+ if let Some(config_path) = get_devalang_homedir().join("config.json").into() {
41
+ let settings = get_user_config().unwrap_or_else(get_default_user_config);
42
+
43
+ let config_json = serde_json::to_string(&settings).unwrap();
44
+
45
+ if let Err(e) = write_config_atomic(&config_path, &config_json) {
46
+ println!("Could not write config file: {}", e);
47
+ }
48
+ } else {
49
+ println!("Could not create config file");
50
+ }
51
+ }
52
+
53
+ pub fn ensure_user_config_file_exists() {
54
+ if let Some(config_path) = get_devalang_homedir().join("config.json").into() {
55
+ if !config_path.exists() {
56
+ write_user_config_file();
57
+ }
58
+ }
59
+ }
60
+
61
+ pub fn set_user_config_value(key: &str, value: JsonValue) {
62
+ let mut settings = get_user_config().unwrap_or_default();
63
+
64
+ match (key, &value) {
65
+ ("telemetry", JsonValue::Bool(b)) => {
66
+ settings.telemetry.enabled = *b;
67
+ }
68
+ ("session", JsonValue::String(s)) => {
69
+ settings.session = s.clone();
70
+ }
71
+ _ => {
72
+ println!("Unsupported key or value type for '{}': {:?}", key, value);
73
+ }
74
+ }
75
+
76
+ if let Some(config_path) = get_devalang_homedir().join("config.json").into() {
77
+ let config_json = serde_json::to_string(&settings).unwrap();
78
+ if let Err(e) = write_config_atomic(&config_path, &config_json) {
79
+ println!("Could not write config file: {}", e);
80
+ }
81
+ } else {
82
+ println!("Could not create config file");
83
+ }
84
+ }
85
+
86
+ pub fn write_config_atomic(
87
+ config_path: &std::path::PathBuf,
88
+ contents: &str,
89
+ ) -> std::io::Result<()> {
90
+ if let Some(parent) = config_path.parent() {
91
+ std::fs::create_dir_all(parent)?;
92
+ }
93
+
94
+ let tmp_path = config_path.with_extension("json.tmp");
95
+ let mut tmp_file = std::fs::File::create(&tmp_path)?;
96
+ tmp_file.write_all(contents.as_bytes())?;
97
+ tmp_file.sync_all()?;
98
+ std::fs::rename(&tmp_path, config_path)?;
99
+
100
+ Ok(())
101
+ }