@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.
Files changed (159) hide show
  1. package/Cargo.toml +84 -81
  2. package/README.md +3 -2
  3. package/docs/CHANGELOG.md +41 -0
  4. package/docs/ROADMAP.md +3 -3
  5. package/examples/chain.deva +19 -0
  6. package/examples/plugin.deva +10 -10
  7. package/examples/routing.deva +23 -0
  8. package/out-tsc/bin/project-version.json +6 -0
  9. package/out-tsc/pkg/devalang_core_bg.wasm.d.ts +8 -8
  10. package/out-tsc/scripts/version/copy-to-binary.d.ts +1 -0
  11. package/out-tsc/scripts/version/copy-to-binary.js +79 -0
  12. package/package.json +23 -10
  13. package/project-version.json +3 -3
  14. package/rust/bindings/Cargo.toml +9 -0
  15. package/rust/bindings/src/lib.rs +86 -0
  16. package/rust/cli/addon/commands.rs +35 -0
  17. package/rust/cli/addon/download.rs +234 -0
  18. package/rust/cli/addon/install.rs +33 -0
  19. package/rust/cli/addon/list.rs +224 -0
  20. package/rust/cli/addon/metadata.rs +124 -0
  21. package/rust/cli/addon/mod.rs +8 -0
  22. package/rust/cli/addon/remove.rs +271 -0
  23. package/rust/cli/addon/update.rs +305 -0
  24. package/rust/cli/{install/addon.rs → addon/utils.rs} +109 -118
  25. package/rust/cli/build/commands.rs +153 -153
  26. package/rust/cli/build/process.rs +165 -165
  27. package/rust/cli/check/mod.rs +208 -208
  28. package/rust/cli/discover/commands.rs +275 -253
  29. package/rust/cli/discover/config.rs +109 -111
  30. package/rust/cli/discover/fs.rs +19 -19
  31. package/rust/cli/discover/install.rs +214 -103
  32. package/rust/cli/discover/metadata.rs +48 -48
  33. package/rust/cli/discover/mod.rs +5 -5
  34. package/rust/cli/me/commands.rs +52 -0
  35. package/rust/cli/me/mod.rs +1 -0
  36. package/rust/cli/mod.rs +12 -12
  37. package/rust/cli/parser.rs +30 -69
  38. package/rust/cli/play/commands.rs +375 -375
  39. package/rust/cli/play/process.rs +159 -159
  40. package/rust/core/audio/engine/driver.rs +19 -2
  41. package/rust/core/audio/engine/export.rs +169 -169
  42. package/rust/core/audio/engine/mod.rs +56 -56
  43. package/rust/core/audio/engine/notes/dsp.rs +88 -85
  44. package/rust/core/audio/engine/notes/mod.rs +53 -44
  45. package/rust/core/audio/engine/notes/params.rs +294 -294
  46. package/rust/core/audio/engine/sample/insert.rs +148 -47
  47. package/rust/core/audio/engine/sample/mod.rs +40 -40
  48. package/rust/core/audio/engine/sample/padding.rs +170 -170
  49. package/rust/core/audio/evaluator/condition.rs +61 -61
  50. package/rust/core/audio/evaluator/numeric.rs +152 -152
  51. package/rust/core/audio/evaluator/rhs.rs +16 -16
  52. package/rust/core/audio/evaluator/string_expr.rs +94 -94
  53. package/rust/core/audio/interpreter/driver.rs +574 -574
  54. package/rust/core/audio/interpreter/mod.rs +2 -2
  55. package/rust/core/audio/interpreter/statements/arrow_call/interprete.rs +9 -5
  56. package/rust/core/audio/interpreter/statements/arrow_call/methods/chord.rs +398 -384
  57. package/rust/core/audio/interpreter/statements/arrow_call/methods/effects.rs +323 -0
  58. package/rust/core/audio/interpreter/statements/arrow_call/methods/mod.rs +1 -0
  59. package/rust/core/audio/interpreter/statements/arrow_call/methods/note.rs +66 -11
  60. package/rust/core/audio/interpreter/statements/arrow_call/mod.rs +3 -3
  61. package/rust/core/audio/interpreter/statements/arrow_call/types/arp.rs +192 -192
  62. package/rust/core/audio/interpreter/statements/arrow_call/types/mod.rs +24 -24
  63. package/rust/core/audio/interpreter/statements/arrow_call/types/pad.rs +116 -116
  64. package/rust/core/audio/interpreter/statements/arrow_call/types/pluck.rs +97 -97
  65. package/rust/core/audio/interpreter/statements/arrow_call/types/sub.rs +100 -100
  66. package/rust/core/audio/interpreter/statements/automate.rs +16 -16
  67. package/rust/core/audio/interpreter/statements/call.rs +31 -1
  68. package/rust/core/audio/interpreter/statements/condition.rs +72 -72
  69. package/rust/core/audio/interpreter/statements/function.rs +24 -24
  70. package/rust/core/audio/interpreter/statements/let_.rs +36 -36
  71. package/rust/core/audio/interpreter/statements/load.rs +17 -17
  72. package/rust/core/audio/interpreter/statements/loop_.rs +115 -115
  73. package/rust/core/audio/interpreter/statements/spawn.rs +51 -2
  74. package/rust/core/audio/interpreter/statements/trigger.rs +242 -239
  75. package/rust/core/audio/loader/trigger.rs +98 -98
  76. package/rust/core/audio/player.rs +70 -70
  77. package/rust/core/audio/special/mod.rs +9 -9
  78. package/rust/core/builder/mod.rs +129 -129
  79. package/rust/core/debugger/lexer.rs +27 -27
  80. package/rust/core/debugger/logs.rs +52 -52
  81. package/rust/core/debugger/preprocessor.rs +27 -27
  82. package/rust/core/debugger/store.rs +38 -38
  83. package/rust/core/lexer/driver.rs +59 -59
  84. package/rust/core/lexer/handler/arrow.rs +82 -82
  85. package/rust/core/lexer/handler/at.rs +21 -21
  86. package/rust/core/lexer/handler/brace.rs +41 -41
  87. package/rust/core/lexer/handler/colon.rs +21 -21
  88. package/rust/core/lexer/handler/comment.rs +30 -30
  89. package/rust/core/lexer/handler/dot.rs +21 -21
  90. package/rust/core/lexer/handler/driver.rs +337 -337
  91. package/rust/core/lexer/handler/identifier.rs +47 -47
  92. package/rust/core/lexer/handler/indent.rs +66 -66
  93. package/rust/core/lexer/handler/mod.rs +15 -15
  94. package/rust/core/lexer/handler/newline.rs +23 -23
  95. package/rust/core/lexer/handler/number.rs +31 -31
  96. package/rust/core/lexer/handler/operator.rs +46 -46
  97. package/rust/core/lexer/handler/parenthesis.rs +41 -41
  98. package/rust/core/lexer/handler/slash.rs +21 -21
  99. package/rust/core/lexer/handler/string.rs +63 -63
  100. package/rust/core/lexer/mod.rs +3 -3
  101. package/rust/core/mod.rs +9 -9
  102. package/rust/core/parser/driver/block.rs +111 -111
  103. package/rust/core/parser/driver/cursor.rs +82 -82
  104. package/rust/core/parser/driver/driver_impl.rs +21 -1
  105. package/rust/core/parser/driver/mod.rs +6 -6
  106. package/rust/core/parser/driver/parse_array.rs +120 -120
  107. package/rust/core/parser/driver/parse_map.rs +247 -223
  108. package/rust/core/parser/driver/parser.rs +160 -160
  109. package/rust/core/parser/handler/arrow_call.rs +65 -14
  110. package/rust/core/parser/handler/identifier/synth.rs +171 -135
  111. package/rust/core/parser/handler/mod.rs +9 -9
  112. package/rust/core/parser/handler/pattern.rs +24 -1
  113. package/rust/core/plugin/loader.rs +137 -137
  114. package/rust/core/plugin/mod.rs +2 -2
  115. package/rust/core/plugin/runner/non_wasm.rs +481 -297
  116. package/rust/core/plugin/runner/wasm32.rs +1 -0
  117. package/rust/core/preprocessor/loader/inject.rs +313 -278
  118. package/rust/core/preprocessor/loader/loader_helpers.rs +110 -110
  119. package/rust/core/preprocessor/loader/mod.rs +235 -235
  120. package/rust/core/preprocessor/module.rs +55 -55
  121. package/rust/core/preprocessor/processor/handlers.rs +107 -107
  122. package/rust/core/preprocessor/resolver/bank.rs +49 -49
  123. package/rust/core/preprocessor/resolver/call.rs +124 -124
  124. package/rust/core/preprocessor/resolver/condition.rs +95 -95
  125. package/rust/core/preprocessor/resolver/driver.rs +324 -324
  126. package/rust/core/preprocessor/resolver/function.rs +69 -69
  127. package/rust/core/preprocessor/resolver/group.rs +122 -122
  128. package/rust/core/preprocessor/resolver/let_.rs +32 -32
  129. package/rust/core/preprocessor/resolver/loop_.rs +318 -318
  130. package/rust/core/preprocessor/resolver/mod.rs +16 -16
  131. package/rust/core/preprocessor/resolver/pattern.rs +95 -83
  132. package/rust/core/preprocessor/resolver/spawn.rs +99 -99
  133. package/rust/core/preprocessor/resolver/synth.rs +54 -54
  134. package/rust/core/preprocessor/resolver/tempo.rs +48 -48
  135. package/rust/core/preprocessor/resolver/trigger.rs +116 -116
  136. package/rust/core/preprocessor/resolver/value.rs +176 -176
  137. package/rust/core/store/global.rs +57 -57
  138. package/rust/lib.rs +323 -323
  139. package/rust/macros/Cargo.toml +14 -0
  140. package/rust/macros/src/lib.rs +52 -0
  141. package/rust/main.rs +311 -142
  142. package/rust/types/Cargo.toml +1 -1
  143. package/rust/types/src/addons.rs +3 -1
  144. package/rust/types/src/config.rs +1 -3
  145. package/rust/utils/Cargo.toml +5 -2
  146. package/rust/utils/src/file.rs +397 -14
  147. package/rust/utils/src/path.rs +31 -2
  148. package/rust/utils/src/version.rs +38 -7
  149. package/rust/web/auth.rs +5 -0
  150. package/rust/web/forge.rs +5 -0
  151. package/rust/web/mod.rs +5 -3
  152. package/typescript/scripts/version/copy-to-binary.ts +82 -0
  153. package/rust/cli/bank/api.rs +0 -122
  154. package/rust/cli/bank/commands.rs +0 -306
  155. package/rust/cli/bank/mod.rs +0 -29
  156. package/rust/cli/install/bank.rs +0 -72
  157. package/rust/cli/install/commands.rs +0 -35
  158. package/rust/cli/install/mod.rs +0 -4
  159. package/rust/cli/install/plugin.rs +0 -80
@@ -1,83 +1,95 @@
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_pattern(
10
- stmt: &Statement,
11
- module: &Module,
12
- path: &str,
13
- global_store: &mut GlobalStore,
14
- ) -> Statement {
15
- let logger = Logger::new();
16
-
17
- // Expecting pattern name stored on the Statement.kind; value may contain the string
18
- if let StatementKind::Pattern { name, target } = &stmt.kind {
19
- // Ensure name doesn't already exist
20
- if global_store.variables.variables.contains_key(name) {
21
- logger.log_error_with_stacktrace(
22
- &format!("Pattern identifier '{}' already exists", name),
23
- path,
24
- );
25
- return Statement {
26
- kind: StatementKind::Error {
27
- message: format!("Pattern '{}' already exists", name),
28
- },
29
- ..stmt.clone()
30
- };
31
- }
32
-
33
- // Resolve potential target and pattern string value
34
- let resolved_value = resolve_value(&stmt.value, module, global_store);
35
-
36
- // Build a map to store the pattern definition
37
- let mut map = std::collections::HashMap::new();
38
- map.insert("identifier".to_string(), Value::String(name.clone()));
39
- if let Some(t) = target {
40
- map.insert("target".to_string(), Value::String(t.clone()));
41
- }
42
- // Keep raw pattern in 'pattern' key
43
- map.insert("pattern".to_string(), resolved_value.clone());
44
-
45
- let resolved_stmt = Statement {
46
- kind: StatementKind::Pattern {
47
- name: name.clone(),
48
- target: target.clone(),
49
- },
50
- value: resolved_value,
51
- ..stmt.clone()
52
- };
53
-
54
- // Store into global variables as a Statement
55
- global_store.variables.variables.insert(
56
- name.clone(),
57
- Value::Statement(Box::new(resolved_stmt.clone())),
58
- );
59
-
60
- return resolved_stmt;
61
- }
62
-
63
- logger.log_message(
64
- LogLevel::Warning,
65
- "resolve_pattern called on non-pattern statement",
66
- );
67
- stmt.clone()
68
- }
69
-
70
- fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore) -> Value {
71
- // reuse driver::resolve_value logic; simple local resolution for pattern value
72
- match value {
73
- Value::String(s) => Value::String(s.clone()),
74
- Value::Map(m) => {
75
- let mut resolved = std::collections::HashMap::new();
76
- for (k, v) in m {
77
- resolved.insert(k.clone(), resolve_value(v, module, global_store));
78
- }
79
- Value::Map(resolved)
80
- }
81
- other => other.clone(),
82
- }
83
- }
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_pattern(
10
+ stmt: &Statement,
11
+ module: &Module,
12
+ path: &str,
13
+ global_store: &mut GlobalStore,
14
+ ) -> Statement {
15
+ let logger = Logger::new();
16
+
17
+ // Expecting pattern name stored on the Statement.kind; value may contain the string
18
+ if let StatementKind::Pattern { name, target } = &stmt.kind {
19
+ // Ensure name doesn't already exist
20
+ if global_store.variables.variables.contains_key(name) {
21
+ logger.log_error_with_stacktrace(
22
+ &format!("Pattern identifier '{}' already exists", name),
23
+ path,
24
+ );
25
+ return Statement {
26
+ kind: StatementKind::Error {
27
+ message: format!("Pattern '{}' already exists", name),
28
+ },
29
+ ..stmt.clone()
30
+ };
31
+ }
32
+
33
+ // Resolve potential target and pattern string value
34
+ let resolved_value = resolve_value(&stmt.value, module, global_store);
35
+
36
+ // Build a map to store the pattern definition
37
+ let mut map = std::collections::HashMap::new();
38
+ map.insert("identifier".to_string(), Value::String(name.clone()));
39
+ if let Some(t) = target {
40
+ map.insert("target".to_string(), Value::String(t.clone()));
41
+ }
42
+ // Keep raw pattern in 'pattern' key if it's a string, or merge options map
43
+ match resolved_value.clone() {
44
+ Value::String(s) => {
45
+ map.insert("pattern".to_string(), Value::String(s));
46
+ }
47
+ Value::Map(m) => {
48
+ for (k, v) in m {
49
+ map.insert(k, v);
50
+ }
51
+ }
52
+ _ => {
53
+ map.insert("pattern".to_string(), resolved_value.clone());
54
+ }
55
+ }
56
+
57
+ let resolved_stmt = Statement {
58
+ kind: StatementKind::Pattern {
59
+ name: name.clone(),
60
+ target: target.clone(),
61
+ },
62
+ value: resolved_value,
63
+ ..stmt.clone()
64
+ };
65
+
66
+ // Store into global variables as a Statement
67
+ global_store.variables.variables.insert(
68
+ name.clone(),
69
+ Value::Statement(Box::new(resolved_stmt.clone())),
70
+ );
71
+
72
+ return resolved_stmt;
73
+ }
74
+
75
+ logger.log_message(
76
+ LogLevel::Warning,
77
+ "resolve_pattern called on non-pattern statement",
78
+ );
79
+ stmt.clone()
80
+ }
81
+
82
+ fn resolve_value(value: &Value, module: &Module, global_store: &mut GlobalStore) -> Value {
83
+ // reuse driver::resolve_value logic; simple local resolution for pattern value
84
+ match value {
85
+ Value::String(s) => Value::String(s.clone()),
86
+ Value::Map(m) => {
87
+ let mut resolved = std::collections::HashMap::new();
88
+ for (k, v) in m {
89
+ resolved.insert(k.clone(), resolve_value(v, module, global_store));
90
+ }
91
+ Value::Map(resolved)
92
+ }
93
+ other => other.clone(),
94
+ }
95
+ }
@@ -1,99 +1,99 @@
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_spawn(
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
- // If it's a function
20
- if let Some(func) = global_store.functions.functions.get(&name) {
21
- let mut resolved_map = std::collections::HashMap::new();
22
- resolved_map.insert("name".to_string(), Value::String(name.clone()));
23
- resolved_map.insert("args".to_string(), Value::Array(args.clone()));
24
- resolved_map.insert("body".to_string(), Value::Block(func.body.clone()));
25
-
26
- return Statement {
27
- kind: StatementKind::Spawn { name, args },
28
- value: Value::Map(resolved_map),
29
- ..stmt.clone()
30
- };
31
- }
32
-
33
- // If it's a group stored in variables
34
- if let Some(Value::Statement(stmt_box)) = global_store.variables.variables.get(&name) {
35
- if let StatementKind::Group = stmt_box.kind {
36
- if let Value::Map(map) = &stmt_box.value {
37
- if let Some(Value::Block(body)) = map.get("body") {
38
- let mut resolved_map = std::collections::HashMap::new();
39
- resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
40
- resolved_map.insert("args".to_string(), Value::Array(args.clone()));
41
- resolved_map.insert("body".to_string(), Value::Block(body.clone()));
42
-
43
- return Statement {
44
- kind: StatementKind::Spawn { name, args },
45
- value: Value::Map(resolved_map),
46
- ..stmt.clone()
47
- };
48
- }
49
- }
50
- }
51
- // Pattern case (make spawn accept patterns stored as variables)
52
- if let StatementKind::Pattern { .. } = stmt_box.kind {
53
- let mut resolved_map = std::collections::HashMap::new();
54
- resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
55
- // pattern value may be a string or a map stored on the statement
56
- match &stmt_box.value {
57
- Value::String(s) => {
58
- resolved_map.insert("pattern".to_string(), Value::String(s.clone()));
59
- }
60
- Value::Map(m) => {
61
- if let Some(val) = m.get("pattern") {
62
- resolved_map.insert("pattern".to_string(), val.clone());
63
- }
64
- if let Some(val) = m.get("target") {
65
- resolved_map.insert("target".to_string(), val.clone());
66
- }
67
- }
68
- _ => {}
69
- }
70
- resolved_map.insert("args".to_string(), Value::Array(args.clone()));
71
-
72
- return Statement {
73
- kind: StatementKind::Spawn { name, args },
74
- value: Value::Map(resolved_map),
75
- ..stmt.clone()
76
- };
77
- }
78
- }
79
-
80
- // Otherwise, log an error
81
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
82
- logger.log_message(
83
- LogLevel::Error,
84
- &format!(
85
- "Function or group '{}' not found for spawn\n → at {stacktrace}",
86
- name
87
- ),
88
- );
89
-
90
- Statement {
91
- kind: StatementKind::Error {
92
- message: format!("Function or group '{}' not found for spawn", name),
93
- },
94
- value: Value::Null,
95
- ..stmt.clone()
96
- }
97
- }
98
-
99
- // (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_spawn(
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
+ // If it's a function
20
+ if let Some(func) = global_store.functions.functions.get(&name) {
21
+ let mut resolved_map = std::collections::HashMap::new();
22
+ resolved_map.insert("name".to_string(), Value::String(name.clone()));
23
+ resolved_map.insert("args".to_string(), Value::Array(args.clone()));
24
+ resolved_map.insert("body".to_string(), Value::Block(func.body.clone()));
25
+
26
+ return Statement {
27
+ kind: StatementKind::Spawn { name, args },
28
+ value: Value::Map(resolved_map),
29
+ ..stmt.clone()
30
+ };
31
+ }
32
+
33
+ // If it's a group stored in variables
34
+ if let Some(Value::Statement(stmt_box)) = global_store.variables.variables.get(&name) {
35
+ if let StatementKind::Group = stmt_box.kind {
36
+ if let Value::Map(map) = &stmt_box.value {
37
+ if let Some(Value::Block(body)) = map.get("body") {
38
+ let mut resolved_map = std::collections::HashMap::new();
39
+ resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
40
+ resolved_map.insert("args".to_string(), Value::Array(args.clone()));
41
+ resolved_map.insert("body".to_string(), Value::Block(body.clone()));
42
+
43
+ return Statement {
44
+ kind: StatementKind::Spawn { name, args },
45
+ value: Value::Map(resolved_map),
46
+ ..stmt.clone()
47
+ };
48
+ }
49
+ }
50
+ }
51
+ // Pattern case (make spawn accept patterns stored as variables)
52
+ if let StatementKind::Pattern { .. } = stmt_box.kind {
53
+ let mut resolved_map = std::collections::HashMap::new();
54
+ resolved_map.insert("identifier".to_string(), Value::String(name.clone()));
55
+ // pattern value may be a string or a map stored on the statement
56
+ match &stmt_box.value {
57
+ Value::String(s) => {
58
+ resolved_map.insert("pattern".to_string(), Value::String(s.clone()));
59
+ }
60
+ Value::Map(m) => {
61
+ if let Some(val) = m.get("pattern") {
62
+ resolved_map.insert("pattern".to_string(), val.clone());
63
+ }
64
+ if let Some(val) = m.get("target") {
65
+ resolved_map.insert("target".to_string(), val.clone());
66
+ }
67
+ }
68
+ _ => {}
69
+ }
70
+ resolved_map.insert("args".to_string(), Value::Array(args.clone()));
71
+
72
+ return Statement {
73
+ kind: StatementKind::Spawn { name, args },
74
+ value: Value::Map(resolved_map),
75
+ ..stmt.clone()
76
+ };
77
+ }
78
+ }
79
+
80
+ // Otherwise, log an error
81
+ let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
82
+ logger.log_message(
83
+ LogLevel::Error,
84
+ &format!(
85
+ "Function or group '{}' not found for spawn\n → at {stacktrace}",
86
+ name
87
+ ),
88
+ );
89
+
90
+ Statement {
91
+ kind: StatementKind::Error {
92
+ message: format!("Function or group '{}' not found for spawn", name),
93
+ },
94
+ value: Value::Null,
95
+ ..stmt.clone()
96
+ }
97
+ }
98
+
99
+ // (removed unused helpers get_group_body, error_stmt)
@@ -1,54 +1,54 @@
1
- use crate::core::{
2
- parser::statement::{Statement, StatementKind},
3
- preprocessor::{module::Module, resolver::driver::resolve_statement},
4
- store::global::GlobalStore,
5
- };
6
- use devalang_types::Value;
7
- use devalang_utils::logger::{LogLevel, Logger};
8
-
9
- pub fn resolve_synth(
10
- stmt: &Statement,
11
- module: &Module,
12
- path: &str,
13
- global_store: &mut GlobalStore,
14
- ) -> Statement {
15
- let logger = Logger::new();
16
-
17
- let Value::Map(synth_map) = &stmt.value else {
18
- return type_error(
19
- &logger,
20
- module,
21
- stmt,
22
- "Expected a map in synth statement".to_string(),
23
- );
24
- };
25
-
26
- let mut resolved_map = synth_map.clone();
27
-
28
- if let Some(Value::Block(body)) = synth_map.get("body") {
29
- let resolved_body = body
30
- .iter()
31
- .map(|s| resolve_statement(s, module, path, global_store))
32
- .collect::<Vec<_>>();
33
- resolved_map.insert("body".to_string(), Value::Block(resolved_body));
34
- } else {
35
- logger.log_message(LogLevel::Warning, "synth without a body");
36
- }
37
-
38
- Statement {
39
- kind: StatementKind::Synth,
40
- value: Value::Map(resolved_map),
41
- ..stmt.clone()
42
- }
43
- }
44
-
45
- fn type_error(logger: &Logger, module: &Module, stmt: &Statement, message: String) -> Statement {
46
- let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
47
- logger.log_error_with_stacktrace(&message, &stacktrace);
48
-
49
- Statement {
50
- kind: StatementKind::Error { message },
51
- value: Value::Null,
52
- ..stmt.clone()
53
- }
54
- }
1
+ use crate::core::{
2
+ parser::statement::{Statement, StatementKind},
3
+ preprocessor::{module::Module, resolver::driver::resolve_statement},
4
+ store::global::GlobalStore,
5
+ };
6
+ use devalang_types::Value;
7
+ use devalang_utils::logger::{LogLevel, Logger};
8
+
9
+ pub fn resolve_synth(
10
+ stmt: &Statement,
11
+ module: &Module,
12
+ path: &str,
13
+ global_store: &mut GlobalStore,
14
+ ) -> Statement {
15
+ let logger = Logger::new();
16
+
17
+ let Value::Map(synth_map) = &stmt.value else {
18
+ return type_error(
19
+ &logger,
20
+ module,
21
+ stmt,
22
+ "Expected a map in synth statement".to_string(),
23
+ );
24
+ };
25
+
26
+ let mut resolved_map = synth_map.clone();
27
+
28
+ if let Some(Value::Block(body)) = synth_map.get("body") {
29
+ let resolved_body = body
30
+ .iter()
31
+ .map(|s| resolve_statement(s, module, path, global_store))
32
+ .collect::<Vec<_>>();
33
+ resolved_map.insert("body".to_string(), Value::Block(resolved_body));
34
+ } else {
35
+ logger.log_message(LogLevel::Warning, "synth without a body");
36
+ }
37
+
38
+ Statement {
39
+ kind: StatementKind::Synth,
40
+ value: Value::Map(resolved_map),
41
+ ..stmt.clone()
42
+ }
43
+ }
44
+
45
+ fn type_error(logger: &Logger, module: &Module, stmt: &Statement, message: String) -> Statement {
46
+ let stacktrace = format!("{}:{}:{}", module.path, stmt.line, stmt.column);
47
+ logger.log_error_with_stacktrace(&message, &stacktrace);
48
+
49
+ Statement {
50
+ kind: StatementKind::Error { message },
51
+ value: Value::Null,
52
+ ..stmt.clone()
53
+ }
54
+ }
@@ -1,48 +1,48 @@
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_tempo(
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
-
18
- match &stmt.value {
19
- Value::Identifier(ident) => {
20
- if let Some(val) = module.variable_table.get(ident) {
21
- new_stmt.value = val.clone();
22
- } else {
23
- let message = format!("Tempo identifier '{ident}' not found in variable table");
24
- logger.log_error_with_stacktrace(&message, &module.path);
25
- new_stmt.kind = StatementKind::Error { message };
26
- new_stmt.value = Value::Null;
27
- }
28
- }
29
-
30
- Value::Number(_) => {
31
- // Already resolved, no modification needed
32
- }
33
-
34
- other => {
35
- let message = format!(
36
- "Expected a number or identifier for tempo, found {:?}",
37
- other
38
- );
39
- logger.log_error_with_stacktrace(&message, &module.path);
40
- new_stmt.kind = StatementKind::Error {
41
- message: "Expected a number or identifier for tempo".to_string(),
42
- };
43
- new_stmt.value = Value::Null;
44
- }
45
- }
46
-
47
- new_stmt
48
- }
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_tempo(
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
+
18
+ match &stmt.value {
19
+ Value::Identifier(ident) => {
20
+ if let Some(val) = module.variable_table.get(ident) {
21
+ new_stmt.value = val.clone();
22
+ } else {
23
+ let message = format!("Tempo identifier '{ident}' not found in variable table");
24
+ logger.log_error_with_stacktrace(&message, &module.path);
25
+ new_stmt.kind = StatementKind::Error { message };
26
+ new_stmt.value = Value::Null;
27
+ }
28
+ }
29
+
30
+ Value::Number(_) => {
31
+ // Already resolved, no modification needed
32
+ }
33
+
34
+ other => {
35
+ let message = format!(
36
+ "Expected a number or identifier for tempo, found {:?}",
37
+ other
38
+ );
39
+ logger.log_error_with_stacktrace(&message, &module.path);
40
+ new_stmt.kind = StatementKind::Error {
41
+ message: "Expected a number or identifier for tempo".to_string(),
42
+ };
43
+ new_stmt.value = Value::Null;
44
+ }
45
+ }
46
+
47
+ new_stmt
48
+ }