@devaloop/devalang 0.0.1-beta.2 → 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.
- package/Cargo.toml +84 -81
- package/README.md +3 -2
- package/docs/CHANGELOG.md +41 -0
- package/docs/ROADMAP.md +3 -3
- package/examples/chain.deva +19 -0
- package/examples/plugin.deva +10 -10
- package/examples/routing.deva +23 -0
- package/out-tsc/bin/project-version.json +6 -0
- package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +8 -8
- package/out-tsc/scripts/version/copy-to-binary.d.ts +1 -0
- package/out-tsc/scripts/version/copy-to-binary.js +79 -0
- package/package.json +23 -10
- package/project-version.json +3 -3
- package/rust/bindings/Cargo.toml +9 -0
- package/rust/bindings/src/lib.rs +86 -0
- package/rust/cli/addon/commands.rs +35 -0
- package/rust/cli/addon/download.rs +234 -0
- package/rust/cli/addon/install.rs +33 -0
- package/rust/cli/addon/list.rs +224 -0
- package/rust/cli/addon/metadata.rs +124 -0
- package/rust/cli/addon/mod.rs +8 -0
- package/rust/cli/addon/remove.rs +271 -0
- package/rust/cli/addon/update.rs +305 -0
- package/rust/cli/{install/addon.rs → addon/utils.rs} +109 -118
- package/rust/cli/build/commands.rs +153 -153
- package/rust/cli/build/process.rs +165 -165
- package/rust/cli/check/mod.rs +208 -208
- package/rust/cli/discover/commands.rs +275 -253
- package/rust/cli/discover/config.rs +109 -111
- package/rust/cli/discover/fs.rs +19 -19
- package/rust/cli/discover/install.rs +214 -103
- package/rust/cli/discover/metadata.rs +48 -48
- package/rust/cli/discover/mod.rs +5 -5
- package/rust/cli/me/commands.rs +52 -0
- package/rust/cli/me/mod.rs +1 -0
- package/rust/cli/mod.rs +12 -12
- package/rust/cli/parser.rs +30 -69
- package/rust/cli/play/commands.rs +375 -375
- package/rust/cli/play/process.rs +159 -159
- package/rust/core/audio/engine/driver.rs +19 -2
- package/rust/core/audio/engine/export.rs +169 -169
- package/rust/core/audio/engine/mod.rs +56 -56
- package/rust/core/audio/engine/notes/dsp.rs +88 -85
- package/rust/core/audio/engine/notes/mod.rs +53 -44
- package/rust/core/audio/engine/notes/params.rs +294 -294
- package/rust/core/audio/engine/sample/insert.rs +148 -47
- package/rust/core/audio/engine/sample/mod.rs +40 -40
- package/rust/core/audio/engine/sample/padding.rs +170 -170
- package/rust/core/audio/evaluator/condition.rs +61 -61
- package/rust/core/audio/evaluator/numeric.rs +152 -152
- package/rust/core/audio/evaluator/rhs.rs +16 -16
- package/rust/core/audio/evaluator/string_expr.rs +94 -94
- package/rust/core/audio/interpreter/driver.rs +574 -574
- package/rust/core/audio/interpreter/mod.rs +2 -2
- package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +9 -5
- package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +398 -384
- package/rust/core/audio/interpreter/statements/arrow_call/methods/effects.rs +323 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +1 -0
- package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +66 -11
- package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +3 -3
- package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +192 -192
- package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +24 -24
- package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +116 -116
- package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +97 -97
- package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +100 -100
- package/rust/core/audio/interpreter/statements/automate.rs +16 -16
- package/rust/core/audio/interpreter/statements/call.rs +31 -1
- package/rust/core/audio/interpreter/statements/condition.rs +72 -72
- package/rust/core/audio/interpreter/statements/function.rs +24 -24
- package/rust/core/audio/interpreter/statements/let_.rs +36 -36
- package/rust/core/audio/interpreter/statements/load.rs +17 -17
- package/rust/core/audio/interpreter/statements/loop_.rs +115 -115
- package/rust/core/audio/interpreter/statements/spawn.rs +51 -2
- package/rust/core/audio/interpreter/statements/trigger.rs +242 -239
- package/rust/core/audio/loader/trigger.rs +98 -98
- package/rust/core/audio/player.rs +70 -70
- package/rust/core/audio/special/mod.rs +9 -9
- package/rust/core/builder/mod.rs +129 -129
- package/rust/core/debugger/lexer.rs +27 -27
- package/rust/core/debugger/logs.rs +52 -52
- package/rust/core/debugger/preprocessor.rs +27 -27
- package/rust/core/debugger/store.rs +38 -38
- package/rust/core/lexer/driver.rs +59 -59
- 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 -337
- package/rust/core/lexer/handler/identifier.rs +47 -47
- package/rust/core/lexer/handler/indent.rs +66 -66
- package/rust/core/lexer/handler/mod.rs +15 -15
- 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 +3 -3
- package/rust/core/mod.rs +9 -9
- package/rust/core/parser/driver/block.rs +111 -111
- package/rust/core/parser/driver/cursor.rs +82 -82
- package/rust/core/parser/driver/driver_impl.rs +21 -1
- package/rust/core/parser/driver/mod.rs +6 -6
- package/rust/core/parser/driver/parse_array.rs +120 -120
- package/rust/core/parser/driver/parse_map.rs +247 -223
- package/rust/core/parser/driver/parser.rs +160 -160
- package/rust/core/parser/handler/arrow_call.rs +65 -14
- package/rust/core/parser/handler/identifier/synth.rs +171 -135
- package/rust/core/parser/handler/mod.rs +9 -9
- package/rust/core/parser/handler/pattern.rs +24 -1
- package/rust/core/plugin/loader.rs +137 -137
- package/rust/core/plugin/mod.rs +2 -2
- package/rust/core/plugin/runner/non_wasm.rs +481 -297
- package/rust/core/plugin/runner/wasm32.rs +1 -0
- package/rust/core/preprocessor/loader/inject.rs +313 -278
- package/rust/core/preprocessor/loader/loader_helpers.rs +110 -110
- package/rust/core/preprocessor/loader/mod.rs +235 -235
- package/rust/core/preprocessor/module.rs +55 -55
- package/rust/core/preprocessor/processor/handlers.rs +107 -107
- package/rust/core/preprocessor/resolver/bank.rs +49 -49
- package/rust/core/preprocessor/resolver/call.rs +124 -124
- package/rust/core/preprocessor/resolver/condition.rs +95 -95
- package/rust/core/preprocessor/resolver/driver.rs +324 -324
- package/rust/core/preprocessor/resolver/function.rs +69 -69
- package/rust/core/preprocessor/resolver/group.rs +122 -122
- package/rust/core/preprocessor/resolver/let_.rs +32 -32
- package/rust/core/preprocessor/resolver/loop_.rs +318 -318
- package/rust/core/preprocessor/resolver/mod.rs +16 -16
- package/rust/core/preprocessor/resolver/pattern.rs +95 -83
- package/rust/core/preprocessor/resolver/spawn.rs +99 -99
- package/rust/core/preprocessor/resolver/synth.rs +54 -54
- package/rust/core/preprocessor/resolver/tempo.rs +48 -48
- package/rust/core/preprocessor/resolver/trigger.rs +116 -116
- package/rust/core/preprocessor/resolver/value.rs +176 -176
- package/rust/core/store/global.rs +57 -57
- package/rust/lib.rs +323 -323
- package/rust/macros/Cargo.toml +14 -0
- package/rust/macros/src/lib.rs +52 -0
- package/rust/main.rs +311 -142
- package/rust/types/Cargo.toml +1 -1
- package/rust/types/src/addons.rs +3 -1
- package/rust/types/src/config.rs +1 -3
- package/rust/utils/Cargo.toml +5 -2
- package/rust/utils/src/file.rs +397 -14
- package/rust/utils/src/path.rs +31 -2
- package/rust/utils/src/version.rs +38 -7
- package/rust/web/auth.rs +5 -0
- package/rust/web/forge.rs +5 -0
- package/rust/web/mod.rs +5 -3
- package/typescript/scripts/version/copy-to-binary.ts +82 -0
- package/rust/cli/bank/api.rs +0 -122
- package/rust/cli/bank/commands.rs +0 -306
- package/rust/cli/bank/mod.rs +0 -29
- package/rust/cli/install/bank.rs +0 -72
- package/rust/cli/install/commands.rs +0 -35
- package/rust/cli/install/mod.rs +0 -4
- package/rust/cli/install/plugin.rs +0 -80
|
@@ -1,107 +1,107 @@
|
|
|
1
|
-
use crate::core::{
|
|
2
|
-
parser::statement::StatementKind, preprocessor::loader::ModuleLoader,
|
|
3
|
-
store::global::GlobalStore,
|
|
4
|
-
};
|
|
5
|
-
use devalang_types::Value;
|
|
6
|
-
use devalang_utils::path::{normalize_path, resolve_relative_path};
|
|
7
|
-
use std::collections::HashMap;
|
|
8
|
-
|
|
9
|
-
pub fn process_modules(_module_loader: &ModuleLoader, global_store: &mut GlobalStore) {
|
|
10
|
-
for module in global_store.modules.values_mut() {
|
|
11
|
-
let logger = devalang_utils::logger::Logger::new();
|
|
12
|
-
use devalang_utils::logger::LogLevel;
|
|
13
|
-
|
|
14
|
-
for stmt in &module.statements {
|
|
15
|
-
match &stmt.kind {
|
|
16
|
-
StatementKind::Let { name } => {
|
|
17
|
-
if let Value::Null = stmt.value {
|
|
18
|
-
logger.log_message(
|
|
19
|
-
LogLevel::Error,
|
|
20
|
-
&format!("Variable '{}' is declared but not initialized.", name),
|
|
21
|
-
);
|
|
22
|
-
module.variable_table.variables.insert(
|
|
23
|
-
name.clone(),
|
|
24
|
-
Value::StatementKind(Box::new(stmt.kind.clone())),
|
|
25
|
-
);
|
|
26
|
-
continue;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
if module.variable_table.get(name).is_some() {
|
|
30
|
-
logger.log_message(
|
|
31
|
-
LogLevel::Error,
|
|
32
|
-
&format!("Variable '{}' is already defined in this scope.", name),
|
|
33
|
-
);
|
|
34
|
-
continue;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
if let Some(module_variable) = module.variable_table.variables.get(name) {
|
|
38
|
-
logger.log_message(
|
|
39
|
-
LogLevel::Error,
|
|
40
|
-
&format!(
|
|
41
|
-
"Variable '{}' is already defined globally with value: {:?}",
|
|
42
|
-
name, module_variable
|
|
43
|
-
),
|
|
44
|
-
);
|
|
45
|
-
continue;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
module
|
|
49
|
-
.variable_table
|
|
50
|
-
.variables
|
|
51
|
-
.insert(name.clone(), stmt.value.clone());
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
StatementKind::Load { source, alias } => {
|
|
55
|
-
let module_dir = std::path::Path::new(&module.path)
|
|
56
|
-
.parent()
|
|
57
|
-
.unwrap_or(std::path::Path::new(""));
|
|
58
|
-
let resolved_path = normalize_path(module_dir.join(source));
|
|
59
|
-
module
|
|
60
|
-
.variable_table
|
|
61
|
-
.variables
|
|
62
|
-
.insert(alias.clone(), Value::Sample(resolved_path));
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
StatementKind::Export { names, source: _ } => {
|
|
66
|
-
for name in names {
|
|
67
|
-
if let Some(val) = module.variable_table.get(name) {
|
|
68
|
-
module.export_table.add_export(name.clone(), val.clone());
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
StatementKind::Import { names, source } => {
|
|
74
|
-
let resolved = resolve_relative_path(&module.path, source);
|
|
75
|
-
for name in names {
|
|
76
|
-
module
|
|
77
|
-
.import_table
|
|
78
|
-
.add_import(name.clone(), Value::String(resolved.clone()));
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
StatementKind::Group => {
|
|
83
|
-
if let Value::Map(map) = &stmt.value {
|
|
84
|
-
if let (Some(Value::String(name)), Some(Value::Block(body))) =
|
|
85
|
-
(map.get("identifier"), map.get("body"))
|
|
86
|
-
{
|
|
87
|
-
let mut stored_map = HashMap::new();
|
|
88
|
-
stored_map
|
|
89
|
-
.insert("identifier".to_string(), Value::String(name.clone()));
|
|
90
|
-
stored_map.insert("body".to_string(), Value::Block(body.clone()));
|
|
91
|
-
module
|
|
92
|
-
.variable_table
|
|
93
|
-
.set(name.to_string(), Value::Map(stored_map));
|
|
94
|
-
} else {
|
|
95
|
-
logger.log_message(
|
|
96
|
-
LogLevel::Error,
|
|
97
|
-
&format!("Invalid group definition: {:?}", stmt.value),
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
_ => {}
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
1
|
+
use crate::core::{
|
|
2
|
+
parser::statement::StatementKind, preprocessor::loader::ModuleLoader,
|
|
3
|
+
store::global::GlobalStore,
|
|
4
|
+
};
|
|
5
|
+
use devalang_types::Value;
|
|
6
|
+
use devalang_utils::path::{normalize_path, resolve_relative_path};
|
|
7
|
+
use std::collections::HashMap;
|
|
8
|
+
|
|
9
|
+
pub fn process_modules(_module_loader: &ModuleLoader, global_store: &mut GlobalStore) {
|
|
10
|
+
for module in global_store.modules.values_mut() {
|
|
11
|
+
let logger = devalang_utils::logger::Logger::new();
|
|
12
|
+
use devalang_utils::logger::LogLevel;
|
|
13
|
+
|
|
14
|
+
for stmt in &module.statements {
|
|
15
|
+
match &stmt.kind {
|
|
16
|
+
StatementKind::Let { name } => {
|
|
17
|
+
if let Value::Null = stmt.value {
|
|
18
|
+
logger.log_message(
|
|
19
|
+
LogLevel::Error,
|
|
20
|
+
&format!("Variable '{}' is declared but not initialized.", name),
|
|
21
|
+
);
|
|
22
|
+
module.variable_table.variables.insert(
|
|
23
|
+
name.clone(),
|
|
24
|
+
Value::StatementKind(Box::new(stmt.kind.clone())),
|
|
25
|
+
);
|
|
26
|
+
continue;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
if module.variable_table.get(name).is_some() {
|
|
30
|
+
logger.log_message(
|
|
31
|
+
LogLevel::Error,
|
|
32
|
+
&format!("Variable '{}' is already defined in this scope.", name),
|
|
33
|
+
);
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
if let Some(module_variable) = module.variable_table.variables.get(name) {
|
|
38
|
+
logger.log_message(
|
|
39
|
+
LogLevel::Error,
|
|
40
|
+
&format!(
|
|
41
|
+
"Variable '{}' is already defined globally with value: {:?}",
|
|
42
|
+
name, module_variable
|
|
43
|
+
),
|
|
44
|
+
);
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
module
|
|
49
|
+
.variable_table
|
|
50
|
+
.variables
|
|
51
|
+
.insert(name.clone(), stmt.value.clone());
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
StatementKind::Load { source, alias } => {
|
|
55
|
+
let module_dir = std::path::Path::new(&module.path)
|
|
56
|
+
.parent()
|
|
57
|
+
.unwrap_or(std::path::Path::new(""));
|
|
58
|
+
let resolved_path = normalize_path(module_dir.join(source));
|
|
59
|
+
module
|
|
60
|
+
.variable_table
|
|
61
|
+
.variables
|
|
62
|
+
.insert(alias.clone(), Value::Sample(resolved_path));
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
StatementKind::Export { names, source: _ } => {
|
|
66
|
+
for name in names {
|
|
67
|
+
if let Some(val) = module.variable_table.get(name) {
|
|
68
|
+
module.export_table.add_export(name.clone(), val.clone());
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
StatementKind::Import { names, source } => {
|
|
74
|
+
let resolved = resolve_relative_path(&module.path, source);
|
|
75
|
+
for name in names {
|
|
76
|
+
module
|
|
77
|
+
.import_table
|
|
78
|
+
.add_import(name.clone(), Value::String(resolved.clone()));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
StatementKind::Group => {
|
|
83
|
+
if let Value::Map(map) = &stmt.value {
|
|
84
|
+
if let (Some(Value::String(name)), Some(Value::Block(body))) =
|
|
85
|
+
(map.get("identifier"), map.get("body"))
|
|
86
|
+
{
|
|
87
|
+
let mut stored_map = HashMap::new();
|
|
88
|
+
stored_map
|
|
89
|
+
.insert("identifier".to_string(), Value::String(name.clone()));
|
|
90
|
+
stored_map.insert("body".to_string(), Value::Block(body.clone()));
|
|
91
|
+
module
|
|
92
|
+
.variable_table
|
|
93
|
+
.set(name.to_string(), Value::Map(stored_map));
|
|
94
|
+
} else {
|
|
95
|
+
logger.log_message(
|
|
96
|
+
LogLevel::Error,
|
|
97
|
+
&format!("Invalid group definition: {:?}", stmt.value),
|
|
98
|
+
);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
_ => {}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
use crate::core::{
|
|
2
|
-
parser::statement::{Statement, StatementKind},
|
|
3
|
-
preprocessor::module::Module,
|
|
4
|
-
store::global::GlobalStore,
|
|
5
|
-
};
|
|
6
|
-
use devalang_types::Value;
|
|
7
|
-
use devalang_utils::logger::Logger;
|
|
8
|
-
|
|
9
|
-
pub fn resolve_bank(
|
|
10
|
-
stmt: &Statement,
|
|
11
|
-
module: &Module,
|
|
12
|
-
_path: &str,
|
|
13
|
-
_global_store: &GlobalStore,
|
|
14
|
-
) -> Statement {
|
|
15
|
-
let mut new_stmt = stmt.clone();
|
|
16
|
-
let logger = Logger::new();
|
|
17
|
-
match &stmt.value {
|
|
18
|
-
Value::Identifier(ident) => {
|
|
19
|
-
if let Some(val) = module.variable_table.get(ident) {
|
|
20
|
-
new_stmt.value = val.clone();
|
|
21
|
-
} else {
|
|
22
|
-
let message = format!("Bank identifier '{ident}' not found in variable table");
|
|
23
|
-
logger.log_error_with_stacktrace(&message, &module.path);
|
|
24
|
-
new_stmt.kind = StatementKind::Error {
|
|
25
|
-
message: message.clone(),
|
|
26
|
-
};
|
|
27
|
-
new_stmt.value = Value::Null;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
Value::String(_) => {}
|
|
32
|
-
|
|
33
|
-
Value::Number(_) => {}
|
|
34
|
-
|
|
35
|
-
other => {
|
|
36
|
-
let message = format!(
|
|
37
|
-
"Expected a string or identifier for bank, found {:?}",
|
|
38
|
-
other
|
|
39
|
-
);
|
|
40
|
-
logger.log_error_with_stacktrace(&message, &module.path);
|
|
41
|
-
new_stmt.kind = StatementKind::Error {
|
|
42
|
-
message: "Expected a string or identifier for bank".to_string(),
|
|
43
|
-
};
|
|
44
|
-
new_stmt.value = Value::Null;
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
new_stmt
|
|
49
|
-
}
|
|
1
|
+
use crate::core::{
|
|
2
|
+
parser::statement::{Statement, StatementKind},
|
|
3
|
+
preprocessor::module::Module,
|
|
4
|
+
store::global::GlobalStore,
|
|
5
|
+
};
|
|
6
|
+
use devalang_types::Value;
|
|
7
|
+
use devalang_utils::logger::Logger;
|
|
8
|
+
|
|
9
|
+
pub fn resolve_bank(
|
|
10
|
+
stmt: &Statement,
|
|
11
|
+
module: &Module,
|
|
12
|
+
_path: &str,
|
|
13
|
+
_global_store: &GlobalStore,
|
|
14
|
+
) -> Statement {
|
|
15
|
+
let mut new_stmt = stmt.clone();
|
|
16
|
+
let logger = Logger::new();
|
|
17
|
+
match &stmt.value {
|
|
18
|
+
Value::Identifier(ident) => {
|
|
19
|
+
if let Some(val) = module.variable_table.get(ident) {
|
|
20
|
+
new_stmt.value = val.clone();
|
|
21
|
+
} else {
|
|
22
|
+
let message = format!("Bank identifier '{ident}' not found in variable table");
|
|
23
|
+
logger.log_error_with_stacktrace(&message, &module.path);
|
|
24
|
+
new_stmt.kind = StatementKind::Error {
|
|
25
|
+
message: message.clone(),
|
|
26
|
+
};
|
|
27
|
+
new_stmt.value = Value::Null;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
Value::String(_) => {}
|
|
32
|
+
|
|
33
|
+
Value::Number(_) => {}
|
|
34
|
+
|
|
35
|
+
other => {
|
|
36
|
+
let message = format!(
|
|
37
|
+
"Expected a string or identifier for bank, found {:?}",
|
|
38
|
+
other
|
|
39
|
+
);
|
|
40
|
+
logger.log_error_with_stacktrace(&message, &module.path);
|
|
41
|
+
new_stmt.kind = StatementKind::Error {
|
|
42
|
+
message: "Expected a string or identifier for bank".to_string(),
|
|
43
|
+
};
|
|
44
|
+
new_stmt.value = Value::Null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
new_stmt
|
|
49
|
+
}
|
|
@@ -1,124 +1,124 @@
|
|
|
1
|
-
use crate::core::{
|
|
2
|
-
parser::statement::{Statement, StatementKind},
|
|
3
|
-
preprocessor::module::Module,
|
|
4
|
-
store::global::GlobalStore,
|
|
5
|
-
};
|
|
6
|
-
use devalang_types::Value;
|
|
7
|
-
use devalang_utils::logger::{LogLevel, Logger};
|
|
8
|
-
|
|
9
|
-
pub fn resolve_call(
|
|
10
|
-
stmt: &Statement,
|
|
11
|
-
name: String,
|
|
12
|
-
args: Vec<Value>,
|
|
13
|
-
module: &Module,
|
|
14
|
-
_path: &str,
|
|
15
|
-
global_store: &mut GlobalStore,
|
|
16
|
-
) -> Statement {
|
|
17
|
-
let logger = Logger::new();
|
|
18
|
-
|
|
19
|
-
match &stmt.kind {
|
|
20
|
-
StatementKind::Call { .. } => {
|
|
21
|
-
// Check if it's a function
|
|
22
|
-
if let Some(func) = global_store.functions.functions.get(&name) {
|
|
23
|
-
let mut call_map = std::collections::HashMap::new();
|
|
24
|
-
call_map.insert("name".to_string(), Value::Identifier(name.clone()));
|
|
25
|
-
call_map.insert(
|
|
26
|
-
"parameters".to_string(),
|
|
27
|
-
Value::Array(
|
|
28
|
-
func.parameters
|
|
29
|
-
.iter()
|
|
30
|
-
.map(|p| Value::Identifier(p.clone()))
|
|
31
|
-
.collect(),
|
|
32
|
-
),
|
|
33
|
-
);
|
|
34
|
-
call_map.insert("args".to_string(), Value::Array(args.clone()));
|
|
35
|
-
call_map.insert("body".to_string(), Value::Block(func.body.clone()));
|
|
36
|
-
|
|
37
|
-
return Statement {
|
|
38
|
-
kind: StatementKind::Call { name, args },
|
|
39
|
-
value: Value::Map(call_map),
|
|
40
|
-
..stmt.clone()
|
|
41
|
-
};
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Otherwise, check if it's a variable (e.g. group)
|
|
45
|
-
if let Some(Value::Statement(stmt_box)) = global_store.variables.variables.get(&name) {
|
|
46
|
-
if let StatementKind::Group = stmt_box.kind {
|
|
47
|
-
if let Value::Map(map) = &stmt_box.value {
|
|
48
|
-
if let Some(Value::Block(body)) = map.get("body") {
|
|
49
|
-
let mut resolved_map = std::collections::HashMap::new();
|
|
50
|
-
resolved_map
|
|
51
|
-
.insert("identifier".to_string(), Value::String(name.clone()));
|
|
52
|
-
resolved_map.insert("args".to_string(), Value::Array(args.clone()));
|
|
53
|
-
resolved_map.insert("body".to_string(), Value::Block(body.clone()));
|
|
54
|
-
|
|
55
|
-
return Statement {
|
|
56
|
-
kind: StatementKind::Call { name, args },
|
|
57
|
-
value: Value::Map(resolved_map),
|
|
58
|
-
..stmt.clone()
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
// Pattern case
|
|
64
|
-
if let StatementKind::Pattern { .. } = stmt_box.kind {
|
|
65
|
-
// pattern value may be a string or a map stored on the statement
|
|
66
|
-
let mut resolved_map = std::collections::HashMap::new();
|
|
67
|
-
resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
|
|
68
|
-
// pattern value
|
|
69
|
-
match &stmt_box.value {
|
|
70
|
-
Value::String(s) => {
|
|
71
|
-
resolved_map.insert("pattern".to_string(), Value::String(s.clone()));
|
|
72
|
-
}
|
|
73
|
-
Value::Map(m) => {
|
|
74
|
-
if let Some(val) = m.get("pattern") {
|
|
75
|
-
resolved_map.insert("pattern".to_string(), val.clone());
|
|
76
|
-
}
|
|
77
|
-
if let Some(val) = m.get("target") {
|
|
78
|
-
resolved_map.insert("target".to_string(), val.clone());
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
_ => {}
|
|
82
|
-
}
|
|
83
|
-
resolved_map.insert("args".to_string(), Value::Array(args.clone()));
|
|
84
|
-
|
|
85
|
-
return Statement {
|
|
86
|
-
kind: StatementKind::Call { name, args },
|
|
87
|
-
value: Value::Map(resolved_map),
|
|
88
|
-
..stmt.clone()
|
|
89
|
-
};
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Otherwise, log an error
|
|
94
|
-
logger.log_message(
|
|
95
|
-
LogLevel::Error,
|
|
96
|
-
&format!("Function or group '{}' not found", name),
|
|
97
|
-
);
|
|
98
|
-
Statement {
|
|
99
|
-
kind: StatementKind::Error {
|
|
100
|
-
message: format!("Function or group '{}' not found", name),
|
|
101
|
-
},
|
|
102
|
-
value: Value::Null,
|
|
103
|
-
..stmt.clone()
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
_ => {
|
|
107
|
-
let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
|
|
108
|
-
logger.log_message(
|
|
109
|
-
LogLevel::Error,
|
|
110
|
-
&format!("Expected StatementKind::Call in resolve_call()\n → at {stacktrace}"),
|
|
111
|
-
);
|
|
112
|
-
|
|
113
|
-
Statement {
|
|
114
|
-
kind: StatementKind::Error {
|
|
115
|
-
message: "Expected StatementKind::Call in resolve_call()".to_string(),
|
|
116
|
-
},
|
|
117
|
-
value: Value::Null,
|
|
118
|
-
..stmt.clone()
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// (removed unused helpers get_group_body, error_stmt)
|
|
1
|
+
use crate::core::{
|
|
2
|
+
parser::statement::{Statement, StatementKind},
|
|
3
|
+
preprocessor::module::Module,
|
|
4
|
+
store::global::GlobalStore,
|
|
5
|
+
};
|
|
6
|
+
use devalang_types::Value;
|
|
7
|
+
use devalang_utils::logger::{LogLevel, Logger};
|
|
8
|
+
|
|
9
|
+
pub fn resolve_call(
|
|
10
|
+
stmt: &Statement,
|
|
11
|
+
name: String,
|
|
12
|
+
args: Vec<Value>,
|
|
13
|
+
module: &Module,
|
|
14
|
+
_path: &str,
|
|
15
|
+
global_store: &mut GlobalStore,
|
|
16
|
+
) -> Statement {
|
|
17
|
+
let logger = Logger::new();
|
|
18
|
+
|
|
19
|
+
match &stmt.kind {
|
|
20
|
+
StatementKind::Call { .. } => {
|
|
21
|
+
// Check if it's a function
|
|
22
|
+
if let Some(func) = global_store.functions.functions.get(&name) {
|
|
23
|
+
let mut call_map = std::collections::HashMap::new();
|
|
24
|
+
call_map.insert("name".to_string(), Value::Identifier(name.clone()));
|
|
25
|
+
call_map.insert(
|
|
26
|
+
"parameters".to_string(),
|
|
27
|
+
Value::Array(
|
|
28
|
+
func.parameters
|
|
29
|
+
.iter()
|
|
30
|
+
.map(|p| Value::Identifier(p.clone()))
|
|
31
|
+
.collect(),
|
|
32
|
+
),
|
|
33
|
+
);
|
|
34
|
+
call_map.insert("args".to_string(), Value::Array(args.clone()));
|
|
35
|
+
call_map.insert("body".to_string(), Value::Block(func.body.clone()));
|
|
36
|
+
|
|
37
|
+
return Statement {
|
|
38
|
+
kind: StatementKind::Call { name, args },
|
|
39
|
+
value: Value::Map(call_map),
|
|
40
|
+
..stmt.clone()
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Otherwise, check if it's a variable (e.g. group)
|
|
45
|
+
if let Some(Value::Statement(stmt_box)) = global_store.variables.variables.get(&name) {
|
|
46
|
+
if let StatementKind::Group = stmt_box.kind {
|
|
47
|
+
if let Value::Map(map) = &stmt_box.value {
|
|
48
|
+
if let Some(Value::Block(body)) = map.get("body") {
|
|
49
|
+
let mut resolved_map = std::collections::HashMap::new();
|
|
50
|
+
resolved_map
|
|
51
|
+
.insert("identifier".to_string(), Value::String(name.clone()));
|
|
52
|
+
resolved_map.insert("args".to_string(), Value::Array(args.clone()));
|
|
53
|
+
resolved_map.insert("body".to_string(), Value::Block(body.clone()));
|
|
54
|
+
|
|
55
|
+
return Statement {
|
|
56
|
+
kind: StatementKind::Call { name, args },
|
|
57
|
+
value: Value::Map(resolved_map),
|
|
58
|
+
..stmt.clone()
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
// Pattern case
|
|
64
|
+
if let StatementKind::Pattern { .. } = stmt_box.kind {
|
|
65
|
+
// pattern value may be a string or a map stored on the statement
|
|
66
|
+
let mut resolved_map = std::collections::HashMap::new();
|
|
67
|
+
resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
|
|
68
|
+
// pattern value
|
|
69
|
+
match &stmt_box.value {
|
|
70
|
+
Value::String(s) => {
|
|
71
|
+
resolved_map.insert("pattern".to_string(), Value::String(s.clone()));
|
|
72
|
+
}
|
|
73
|
+
Value::Map(m) => {
|
|
74
|
+
if let Some(val) = m.get("pattern") {
|
|
75
|
+
resolved_map.insert("pattern".to_string(), val.clone());
|
|
76
|
+
}
|
|
77
|
+
if let Some(val) = m.get("target") {
|
|
78
|
+
resolved_map.insert("target".to_string(), val.clone());
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
_ => {}
|
|
82
|
+
}
|
|
83
|
+
resolved_map.insert("args".to_string(), Value::Array(args.clone()));
|
|
84
|
+
|
|
85
|
+
return Statement {
|
|
86
|
+
kind: StatementKind::Call { name, args },
|
|
87
|
+
value: Value::Map(resolved_map),
|
|
88
|
+
..stmt.clone()
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Otherwise, log an error
|
|
94
|
+
logger.log_message(
|
|
95
|
+
LogLevel::Error,
|
|
96
|
+
&format!("Function or group '{}' not found", name),
|
|
97
|
+
);
|
|
98
|
+
Statement {
|
|
99
|
+
kind: StatementKind::Error {
|
|
100
|
+
message: format!("Function or group '{}' not found", name),
|
|
101
|
+
},
|
|
102
|
+
value: Value::Null,
|
|
103
|
+
..stmt.clone()
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
_ => {
|
|
107
|
+
let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
|
|
108
|
+
logger.log_message(
|
|
109
|
+
LogLevel::Error,
|
|
110
|
+
&format!("Expected StatementKind::Call in resolve_call()\n → at {stacktrace}"),
|
|
111
|
+
);
|
|
112
|
+
|
|
113
|
+
Statement {
|
|
114
|
+
kind: StatementKind::Error {
|
|
115
|
+
message: "Expected StatementKind::Call in resolve_call()".to_string(),
|
|
116
|
+
},
|
|
117
|
+
value: Value::Null,
|
|
118
|
+
..stmt.clone()
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// (removed unused helpers get_group_body, error_stmt)
|