@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.
- package/.devalang +2 -0
- package/.github/workflows/ci.yml +92 -0
- package/Cargo.toml +60 -58
- package/README.md +1 -1
- package/docs/CHANGELOG.md +34 -1
- package/docs/CONTRIBUTING.md +101 -1
- package/docs/ROADMAP.md +1 -1
- package/docs/TODO.md +1 -1
- package/examples/automation.deva +1 -3
- package/examples/bank.deva +4 -4
- package/examples/events.deva +12 -0
- package/examples/function.deva +4 -4
- package/examples/index.deva +3 -5
- package/examples/loop.deva +5 -11
- package/examples/pattern.deva +8 -0
- package/examples/plugin.deva +12 -11
- package/examples/variables.deva +1 -1
- package/out-tsc/bin/index.js +51 -7
- package/out-tsc/index.js +3 -1
- package/out-tsc/scripts/postbuild.js +9 -10
- package/out-tsc/scripts/postinstall.js +49 -0
- package/package.json +12 -4
- package/project-version.json +3 -3
- package/rust/cli/bank.rs +462 -455
- package/rust/cli/build.rs +252 -199
- package/rust/cli/check.rs +221 -180
- package/rust/cli/driver.rs +297 -292
- package/rust/cli/generator.rs +1 -0
- package/rust/cli/init.rs +87 -79
- package/rust/cli/install.rs +35 -32
- package/rust/cli/login.rs +127 -134
- package/rust/cli/mod.rs +13 -11
- package/rust/cli/play.rs +1123 -218
- package/rust/cli/telemetry.rs +19 -0
- package/rust/cli/template.rs +69 -57
- package/rust/cli/update.rs +6 -4
- package/rust/common/api.rs +5 -5
- package/rust/common/mod.rs +3 -3
- package/rust/config/driver.rs +118 -94
- package/rust/config/loader.rs +165 -156
- package/rust/config/mod.rs +4 -2
- package/rust/config/settings.rs +91 -0
- package/rust/config/stats.rs +257 -0
- package/rust/core/audio/engine.rs +696 -659
- package/rust/core/audio/evaluator.rs +263 -132
- package/rust/core/audio/interpreter/arrow_call.rs +198 -187
- package/rust/core/audio/interpreter/call.rs +98 -95
- package/rust/core/audio/interpreter/condition.rs +70 -71
- package/rust/core/audio/interpreter/driver.rs +487 -231
- package/rust/core/audio/interpreter/function.rs +26 -21
- package/rust/core/audio/interpreter/let_.rs +38 -26
- package/rust/core/audio/interpreter/load.rs +18 -18
- package/rust/core/audio/interpreter/loop_.rs +113 -106
- package/rust/core/audio/interpreter/mod.rs +14 -14
- package/rust/core/audio/interpreter/sleep.rs +27 -28
- package/rust/core/audio/interpreter/spawn.rs +105 -102
- package/rust/core/audio/interpreter/tempo.rs +19 -16
- package/rust/core/audio/interpreter/trigger.rs +239 -210
- package/rust/core/audio/loader/mod.rs +1 -1
- package/rust/core/audio/loader/trigger.rs +100 -94
- package/rust/core/audio/mod.rs +7 -7
- package/rust/core/audio/player.rs +64 -64
- package/rust/core/audio/renderer.rs +56 -53
- package/rust/core/audio/special/easing.rs +189 -120
- package/rust/core/audio/special/env.rs +43 -41
- package/rust/core/audio/special/math.rs +102 -92
- package/rust/core/audio/special/mod.rs +9 -9
- package/rust/core/audio/special/modulator.rs +143 -120
- package/rust/core/builder/mod.rs +80 -85
- package/rust/core/debugger/lexer.rs +27 -27
- package/rust/core/debugger/mod.rs +24 -23
- package/rust/core/debugger/module.rs +55 -47
- package/rust/core/debugger/preprocessor.rs +27 -27
- package/rust/core/debugger/store.rs +40 -39
- package/rust/core/error/mod.rs +80 -69
- package/rust/core/lexer/handler/arrow.rs +82 -82
- package/rust/core/lexer/handler/at.rs +21 -21
- package/rust/core/lexer/handler/brace.rs +41 -41
- package/rust/core/lexer/handler/colon.rs +21 -21
- package/rust/core/lexer/handler/comment.rs +30 -30
- package/rust/core/lexer/handler/dot.rs +21 -21
- package/rust/core/lexer/handler/driver.rs +337 -292
- package/rust/core/lexer/handler/identifier.rs +46 -43
- package/rust/core/lexer/handler/indent.rs +66 -66
- package/rust/core/lexer/handler/mod.rs +16 -16
- package/rust/core/lexer/handler/newline.rs +23 -23
- package/rust/core/lexer/handler/number.rs +31 -31
- package/rust/core/lexer/handler/operator.rs +46 -46
- package/rust/core/lexer/handler/parenthesis.rs +41 -41
- package/rust/core/lexer/handler/slash.rs +21 -21
- package/rust/core/lexer/handler/string.rs +63 -63
- package/rust/core/lexer/mod.rs +54 -51
- package/rust/core/lexer/token.rs +97 -94
- package/rust/core/mod.rs +11 -11
- package/rust/core/parser/driver.rs +513 -490
- package/rust/core/parser/handler/arrow_call.rs +233 -227
- package/rust/core/parser/handler/at.rs +245 -162
- package/rust/core/parser/handler/bank.rs +94 -69
- package/rust/core/parser/handler/condition.rs +80 -74
- package/rust/core/parser/handler/dot.rs +143 -135
- package/rust/core/parser/handler/identifier/automate.rs +257 -194
- package/rust/core/parser/handler/identifier/call.rs +91 -88
- package/rust/core/parser/handler/identifier/emit.rs +66 -0
- package/rust/core/parser/handler/identifier/function.rs +100 -91
- package/rust/core/parser/handler/identifier/group.rs +85 -75
- package/rust/core/parser/handler/identifier/let_.rs +158 -143
- package/rust/core/parser/handler/identifier/mod.rs +54 -56
- package/rust/core/parser/handler/identifier/on.rs +98 -0
- package/rust/core/parser/handler/identifier/print.rs +52 -29
- package/rust/core/parser/handler/identifier/sleep.rs +36 -33
- package/rust/core/parser/handler/identifier/spawn.rs +91 -88
- package/rust/core/parser/handler/identifier/synth.rs +65 -63
- package/rust/core/parser/handler/loop_.rs +170 -89
- package/rust/core/parser/handler/mod.rs +8 -8
- package/rust/core/parser/handler/tempo.rs +53 -47
- package/rust/core/parser/mod.rs +4 -4
- package/rust/core/parser/statement.rs +142 -113
- package/rust/core/plugin/loader.rs +123 -48
- package/rust/core/plugin/mod.rs +2 -1
- package/rust/core/plugin/runner.rs +296 -0
- package/rust/core/preprocessor/loader.rs +515 -326
- package/rust/core/preprocessor/mod.rs +4 -4
- package/rust/core/preprocessor/module.rs +60 -58
- package/rust/core/preprocessor/processor.rs +99 -101
- package/rust/core/preprocessor/resolver/bank.rs +51 -48
- package/rust/core/preprocessor/resolver/call.rs +100 -101
- package/rust/core/preprocessor/resolver/condition.rs +97 -97
- package/rust/core/preprocessor/resolver/driver.rs +310 -280
- package/rust/core/preprocessor/resolver/function.rs +69 -68
- package/rust/core/preprocessor/resolver/group.rs +96 -91
- package/rust/core/preprocessor/resolver/let_.rs +32 -28
- package/rust/core/preprocessor/resolver/loop_.rs +320 -121
- package/rust/core/preprocessor/resolver/mod.rs +15 -15
- package/rust/core/preprocessor/resolver/spawn.rs +76 -73
- package/rust/core/preprocessor/resolver/synth.rs +56 -50
- package/rust/core/preprocessor/resolver/tempo.rs +50 -49
- package/rust/core/preprocessor/resolver/trigger.rs +113 -115
- package/rust/core/preprocessor/resolver/value.rs +81 -81
- package/rust/core/shared/duration.rs +9 -9
- package/rust/core/shared/mod.rs +3 -3
- package/rust/core/shared/value.rs +35 -32
- package/rust/core/store/function.rs +34 -34
- package/rust/core/store/global.rs +55 -38
- package/rust/core/store/mod.rs +5 -5
- package/rust/core/store/variable.rs +37 -34
- package/rust/core/utils/mod.rs +2 -2
- package/rust/core/utils/path.rs +37 -31
- package/rust/core/utils/validation.rs +35 -36
- package/rust/installer/addon.rs +84 -80
- package/rust/installer/bank.rs +62 -65
- package/rust/installer/mod.rs +5 -5
- package/rust/installer/plugin.rs +54 -55
- package/rust/installer/utils.rs +56 -56
- package/rust/lib.rs +156 -164
- package/rust/main.rs +250 -144
- package/rust/utils/error.rs +200 -51
- package/rust/utils/file.rs +38 -35
- package/rust/utils/first_usage.rs +76 -0
- package/rust/utils/logger.rs +195 -143
- package/rust/utils/mod.rs +9 -7
- package/rust/utils/signature.rs +19 -17
- package/rust/utils/spinner.rs +22 -19
- package/rust/utils/telemetry.rs +292 -0
- package/rust/utils/watcher.rs +34 -33
- package/templates/minimal/README.md +97 -121
- package/templates/welcome/README.md +97 -121
- package/typescript/bin/index.ts +19 -5
- package/typescript/index.ts +3 -1
- package/typescript/scripts/postbuild.ts +10 -6
- package/typescript/scripts/postinstall.ts +56 -0
- package/typescript/scripts/version/bump.ts +0 -1
- package/typescript/scripts/version/index.ts +0 -1
- package/out-tsc/bin/devalang.exe +0 -0
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
use crate::config::settings::set_user_config_bool;
|
|
2
|
+
|
|
3
|
+
#[cfg(feature = "cli")]
|
|
4
|
+
pub async fn handle_telemetry_enable_command() -> Result<(), String> {
|
|
5
|
+
set_user_config_bool("telemetry", true);
|
|
6
|
+
|
|
7
|
+
println!("Telemetry has been enabled.");
|
|
8
|
+
|
|
9
|
+
Ok(())
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
#[cfg(feature = "cli")]
|
|
13
|
+
pub async fn handle_telemetry_disable_command() -> Result<(), String> {
|
|
14
|
+
set_user_config_bool("telemetry", false);
|
|
15
|
+
|
|
16
|
+
println!("Telemetry has been disabled.");
|
|
17
|
+
|
|
18
|
+
Ok(())
|
|
19
|
+
}
|
package/rust/cli/template.rs
CHANGED
|
@@ -1,57 +1,69 @@
|
|
|
1
|
-
use
|
|
2
|
-
use
|
|
3
|
-
|
|
4
|
-
static TEMPLATES_DIR: Dir = include_dir!("$CARGO_MANIFEST_DIR/templates");
|
|
5
|
-
|
|
6
|
-
#[cfg(feature = "cli")]
|
|
7
|
-
pub fn handle_template_list_command() {
|
|
8
|
-
let available_templates = get_available_templates();
|
|
9
|
-
|
|
10
|
-
println!("📦 Available templates ({}) :\n", available_templates.len());
|
|
11
|
-
|
|
12
|
-
for dir in available_templates {
|
|
13
|
-
println!("• {}", dir);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
println!("\nUsage : devalang init --name <project-name> --template <template-name>");
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
#[cfg(feature = "cli")]
|
|
20
|
-
pub fn handle_template_info_command(name: String) {
|
|
21
|
-
let template_dir = TEMPLATES_DIR.get_dir(name.clone()).unwrap_or_else(|| {
|
|
22
|
-
println!("❌ The template '{}' is not found.", name);
|
|
23
|
-
|
|
24
|
-
std::process::exit(1);
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
let mut file_count = 0;
|
|
28
|
-
let mut dir_count = 0;
|
|
29
|
-
let mut total_size: u64 = 0;
|
|
30
|
-
|
|
31
|
-
fn walk(dir: &Dir, file_count: &mut u32, dir_count: &mut u32, total_size: &mut u64) {
|
|
32
|
-
for entry in dir.entries() {
|
|
33
|
-
match entry {
|
|
34
|
-
DirEntry::File(file) => {
|
|
35
|
-
*file_count += 1;
|
|
36
|
-
*total_size += file.contents().len() as u64;
|
|
37
|
-
}
|
|
38
|
-
DirEntry::Dir(subdir) => {
|
|
39
|
-
*dir_count += 1;
|
|
40
|
-
walk(subdir, file_count, dir_count, total_size);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
walk(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
1
|
+
use crate::utils::file::format_file_size;
|
|
2
|
+
use include_dir::{Dir, DirEntry, include_dir};
|
|
3
|
+
|
|
4
|
+
static TEMPLATES_DIR: Dir = include_dir!("$CARGO_MANIFEST_DIR/templates");
|
|
5
|
+
|
|
6
|
+
#[cfg(feature = "cli")]
|
|
7
|
+
pub fn handle_template_list_command() {
|
|
8
|
+
let available_templates = get_available_templates();
|
|
9
|
+
|
|
10
|
+
println!("📦 Available templates ({}) :\n", available_templates.len());
|
|
11
|
+
|
|
12
|
+
for dir in available_templates {
|
|
13
|
+
println!("• {}", dir);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
println!("\nUsage : devalang init --name <project-name> --template <template-name>");
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
#[cfg(feature = "cli")]
|
|
20
|
+
pub fn handle_template_info_command(name: String) {
|
|
21
|
+
let template_dir = TEMPLATES_DIR.get_dir(name.clone()).unwrap_or_else(|| {
|
|
22
|
+
println!("❌ The template '{}' is not found.", name);
|
|
23
|
+
|
|
24
|
+
std::process::exit(1);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
let mut file_count = 0;
|
|
28
|
+
let mut dir_count = 0;
|
|
29
|
+
let mut total_size: u64 = 0;
|
|
30
|
+
|
|
31
|
+
fn walk(dir: &Dir, file_count: &mut u32, dir_count: &mut u32, total_size: &mut u64) {
|
|
32
|
+
for entry in dir.entries() {
|
|
33
|
+
match entry {
|
|
34
|
+
DirEntry::File(file) => {
|
|
35
|
+
*file_count += 1;
|
|
36
|
+
*total_size += file.contents().len() as u64;
|
|
37
|
+
}
|
|
38
|
+
DirEntry::Dir(subdir) => {
|
|
39
|
+
*dir_count += 1;
|
|
40
|
+
walk(subdir, file_count, dir_count, total_size);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
walk(
|
|
47
|
+
template_dir,
|
|
48
|
+
&mut file_count,
|
|
49
|
+
&mut dir_count,
|
|
50
|
+
&mut total_size,
|
|
51
|
+
);
|
|
52
|
+
|
|
53
|
+
println!("📦 Template : {}", name);
|
|
54
|
+
println!("📂 Content : {file_count} file(s), {dir_count} folder(s)");
|
|
55
|
+
println!("💾 Size : {}", format_file_size(total_size));
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
pub fn get_available_templates() -> Vec<String> {
|
|
59
|
+
TEMPLATES_DIR
|
|
60
|
+
.dirs()
|
|
61
|
+
.map(|dir| {
|
|
62
|
+
dir.path()
|
|
63
|
+
.file_name()
|
|
64
|
+
.unwrap()
|
|
65
|
+
.to_string_lossy()
|
|
66
|
+
.to_string()
|
|
67
|
+
})
|
|
68
|
+
.collect()
|
|
69
|
+
}
|
package/rust/cli/update.rs
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
pub async fn handle_update_command(
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
pub async fn handle_update_command(
|
|
2
|
+
_only: Option<String>,
|
|
3
|
+
) -> Result<(), Box<dyn std::error::Error>> {
|
|
4
|
+
println!("Updates are not yet implemented. This is a placeholder function.");
|
|
5
|
+
Ok(())
|
|
6
|
+
}
|
package/rust/common/api.rs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
pub fn get_api_url() -> String {
|
|
2
|
-
let api_url = "https://api.devalang.com";
|
|
3
|
-
// let api_url = "http://127.0.0.1:8989";
|
|
4
|
-
api_url.to_string()
|
|
5
|
-
}
|
|
1
|
+
pub fn get_api_url() -> String {
|
|
2
|
+
let api_url = "https://api.devalang.com";
|
|
3
|
+
// let api_url = "http://127.0.0.1:8989";
|
|
4
|
+
api_url.to_string()
|
|
5
|
+
}
|
package/rust/common/mod.rs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
pub mod
|
|
2
|
-
pub mod
|
|
3
|
-
pub mod sso;
|
|
1
|
+
pub mod api;
|
|
2
|
+
pub mod cdn;
|
|
3
|
+
pub mod sso;
|
package/rust/config/driver.rs
CHANGED
|
@@ -1,94 +1,118 @@
|
|
|
1
|
-
use
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
pub
|
|
7
|
-
pub
|
|
8
|
-
pub
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
pub
|
|
14
|
-
pub
|
|
15
|
-
pub
|
|
16
|
-
pub
|
|
17
|
-
pub
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
pub
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
pub
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
pub
|
|
36
|
-
pub
|
|
37
|
-
pub
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
::
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
1
|
+
use serde::{Deserialize, Serialize};
|
|
2
|
+
use std::collections::HashMap;
|
|
3
|
+
|
|
4
|
+
#[derive(Debug, Deserialize, Clone, Serialize)]
|
|
5
|
+
pub struct ProjectConfig {
|
|
6
|
+
pub defaults: ProjectConfigDefaults,
|
|
7
|
+
pub banks: Option<Vec<ProjectConfigBankEntry>>,
|
|
8
|
+
pub plugins: Option<Vec<PluginEntry>>,
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
#[derive(Debug, Deserialize, Clone, Serialize)]
|
|
12
|
+
pub struct ProjectConfigDefaults {
|
|
13
|
+
pub entry: Option<String>,
|
|
14
|
+
pub output: Option<String>,
|
|
15
|
+
pub watch: Option<bool>,
|
|
16
|
+
pub repeat: Option<bool>,
|
|
17
|
+
pub debug: Option<bool>,
|
|
18
|
+
pub compress: Option<bool>,
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
#[derive(Debug, Deserialize, Clone, Serialize)]
|
|
22
|
+
pub struct ProjectConfigBankMetadata {
|
|
23
|
+
pub bank: HashMap<String, String>,
|
|
24
|
+
pub triggers: Option<Vec<HashMap<String, String>>>,
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
|
28
|
+
pub struct ProjectConfigBankEntry {
|
|
29
|
+
pub path: String,
|
|
30
|
+
pub version: Option<String>,
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq)]
|
|
34
|
+
pub struct PluginEntry {
|
|
35
|
+
pub path: String,
|
|
36
|
+
pub version: String,
|
|
37
|
+
pub author: String,
|
|
38
|
+
pub access: String,
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
impl ProjectConfig {
|
|
42
|
+
pub fn new() -> Self {
|
|
43
|
+
ProjectConfig {
|
|
44
|
+
defaults: ProjectConfigDefaults {
|
|
45
|
+
entry: None,
|
|
46
|
+
output: None,
|
|
47
|
+
watch: None,
|
|
48
|
+
repeat: None,
|
|
49
|
+
debug: None,
|
|
50
|
+
compress: None,
|
|
51
|
+
},
|
|
52
|
+
banks: Some(Vec::new()),
|
|
53
|
+
plugins: Some(Vec::new()),
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
pub fn with_defaults(
|
|
58
|
+
entry: Option<String>,
|
|
59
|
+
output: Option<String>,
|
|
60
|
+
watch: Option<bool>,
|
|
61
|
+
repeat: Option<bool>,
|
|
62
|
+
debug: Option<bool>,
|
|
63
|
+
compress: Option<bool>,
|
|
64
|
+
) -> Self {
|
|
65
|
+
ProjectConfig {
|
|
66
|
+
defaults: ProjectConfigDefaults {
|
|
67
|
+
entry,
|
|
68
|
+
output,
|
|
69
|
+
watch,
|
|
70
|
+
repeat,
|
|
71
|
+
debug,
|
|
72
|
+
compress,
|
|
73
|
+
},
|
|
74
|
+
banks: Some(Vec::new()),
|
|
75
|
+
plugins: Some(Vec::new()),
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
pub fn get() -> Result<ProjectConfig, String> {
|
|
80
|
+
let root = std::env::current_dir().unwrap();
|
|
81
|
+
let config_path = root.join(".devalang");
|
|
82
|
+
|
|
83
|
+
if config_path.try_exists().is_err() {
|
|
84
|
+
return Err(format!(
|
|
85
|
+
"Config file not found at path: {}",
|
|
86
|
+
config_path.display()
|
|
87
|
+
));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
let config_content = std::fs::read_to_string(&config_path)
|
|
91
|
+
.map_err(|e| format!("Failed to read config file: {}", e))?;
|
|
92
|
+
|
|
93
|
+
let config: ProjectConfig = toml::from_str(&config_content)
|
|
94
|
+
.map_err(|e| format!("Failed to parse config file: {}", e))?;
|
|
95
|
+
|
|
96
|
+
Ok(config)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
pub fn from_string(config_string: &str) -> Result<(Self, String), String> {
|
|
100
|
+
let config: ProjectConfig = toml::from_str(config_string)
|
|
101
|
+
.map_err(|e| format!("Failed to parse config string: {}", e))?;
|
|
102
|
+
let config_path = ".devalang".to_string();
|
|
103
|
+
|
|
104
|
+
Ok((config, config_path))
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
pub fn write(&self, new_config: &ProjectConfig) -> Result<(), String> {
|
|
108
|
+
let config_path = ".devalang";
|
|
109
|
+
|
|
110
|
+
let content = toml::to_string(new_config)
|
|
111
|
+
.map_err(|e| format!("Failed to serialize config: {}", e))?;
|
|
112
|
+
|
|
113
|
+
std::fs::write(config_path, content)
|
|
114
|
+
.map_err(|e| format!("Failed to write config to file '{}': {}", config_path, e))?;
|
|
115
|
+
|
|
116
|
+
Ok(())
|
|
117
|
+
}
|
|
118
|
+
}
|