@devaloop/devalang 0.0.1-alpha.15 → 0.0.1-alpha.16

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 (173) hide show
  1. package/.devalang +2 -0
  2. package/.github/workflows/ci.yml +92 -0
  3. package/Cargo.toml +60 -58
  4. package/README.md +1 -1
  5. package/docs/CHANGELOG.md +34 -1
  6. package/docs/CONTRIBUTING.md +101 -1
  7. package/docs/ROADMAP.md +1 -1
  8. package/docs/TODO.md +1 -1
  9. package/examples/automation.deva +1 -3
  10. package/examples/bank.deva +4 -4
  11. package/examples/events.deva +12 -0
  12. package/examples/function.deva +4 -4
  13. package/examples/index.deva +3 -5
  14. package/examples/loop.deva +5 -11
  15. package/examples/pattern.deva +8 -0
  16. package/examples/plugin.deva +12 -11
  17. package/examples/variables.deva +1 -1
  18. package/out-tsc/bin/index.js +51 -7
  19. package/out-tsc/index.js +3 -1
  20. package/out-tsc/scripts/postbuild.js +9 -10
  21. package/out-tsc/scripts/postinstall.js +49 -0
  22. package/package.json +12 -4
  23. package/project-version.json +3 -3
  24. package/rust/cli/bank.rs +462 -455
  25. package/rust/cli/build.rs +252 -199
  26. package/rust/cli/check.rs +221 -180
  27. package/rust/cli/driver.rs +297 -292
  28. package/rust/cli/generator.rs +1 -0
  29. package/rust/cli/init.rs +87 -79
  30. package/rust/cli/install.rs +35 -32
  31. package/rust/cli/login.rs +127 -134
  32. package/rust/cli/mod.rs +13 -11
  33. package/rust/cli/play.rs +1123 -218
  34. package/rust/cli/telemetry.rs +19 -0
  35. package/rust/cli/template.rs +69 -57
  36. package/rust/cli/update.rs +6 -4
  37. package/rust/common/api.rs +5 -5
  38. package/rust/common/mod.rs +3 -3
  39. package/rust/config/driver.rs +118 -94
  40. package/rust/config/loader.rs +165 -156
  41. package/rust/config/mod.rs +4 -2
  42. package/rust/config/settings.rs +91 -0
  43. package/rust/config/stats.rs +257 -0
  44. package/rust/core/audio/engine.rs +696 -659
  45. package/rust/core/audio/evaluator.rs +263 -132
  46. package/rust/core/audio/interpreter/arrow_call.rs +198 -187
  47. package/rust/core/audio/interpreter/call.rs +98 -95
  48. package/rust/core/audio/interpreter/condition.rs +70 -71
  49. package/rust/core/audio/interpreter/driver.rs +487 -231
  50. package/rust/core/audio/interpreter/function.rs +26 -21
  51. package/rust/core/audio/interpreter/let_.rs +38 -26
  52. package/rust/core/audio/interpreter/load.rs +18 -18
  53. package/rust/core/audio/interpreter/loop_.rs +113 -106
  54. package/rust/core/audio/interpreter/mod.rs +14 -14
  55. package/rust/core/audio/interpreter/sleep.rs +27 -28
  56. package/rust/core/audio/interpreter/spawn.rs +105 -102
  57. package/rust/core/audio/interpreter/tempo.rs +19 -16
  58. package/rust/core/audio/interpreter/trigger.rs +239 -210
  59. package/rust/core/audio/loader/mod.rs +1 -1
  60. package/rust/core/audio/loader/trigger.rs +100 -94
  61. package/rust/core/audio/mod.rs +7 -7
  62. package/rust/core/audio/player.rs +64 -64
  63. package/rust/core/audio/renderer.rs +56 -53
  64. package/rust/core/audio/special/easing.rs +189 -120
  65. package/rust/core/audio/special/env.rs +43 -41
  66. package/rust/core/audio/special/math.rs +102 -92
  67. package/rust/core/audio/special/mod.rs +9 -9
  68. package/rust/core/audio/special/modulator.rs +143 -120
  69. package/rust/core/builder/mod.rs +80 -85
  70. package/rust/core/debugger/lexer.rs +27 -27
  71. package/rust/core/debugger/mod.rs +24 -23
  72. package/rust/core/debugger/module.rs +55 -47
  73. package/rust/core/debugger/preprocessor.rs +27 -27
  74. package/rust/core/debugger/store.rs +40 -39
  75. package/rust/core/error/mod.rs +80 -69
  76. package/rust/core/lexer/handler/arrow.rs +82 -82
  77. package/rust/core/lexer/handler/at.rs +21 -21
  78. package/rust/core/lexer/handler/brace.rs +41 -41
  79. package/rust/core/lexer/handler/colon.rs +21 -21
  80. package/rust/core/lexer/handler/comment.rs +30 -30
  81. package/rust/core/lexer/handler/dot.rs +21 -21
  82. package/rust/core/lexer/handler/driver.rs +337 -292
  83. package/rust/core/lexer/handler/identifier.rs +46 -43
  84. package/rust/core/lexer/handler/indent.rs +66 -66
  85. package/rust/core/lexer/handler/mod.rs +16 -16
  86. package/rust/core/lexer/handler/newline.rs +23 -23
  87. package/rust/core/lexer/handler/number.rs +31 -31
  88. package/rust/core/lexer/handler/operator.rs +46 -46
  89. package/rust/core/lexer/handler/parenthesis.rs +41 -41
  90. package/rust/core/lexer/handler/slash.rs +21 -21
  91. package/rust/core/lexer/handler/string.rs +63 -63
  92. package/rust/core/lexer/mod.rs +54 -51
  93. package/rust/core/lexer/token.rs +97 -94
  94. package/rust/core/mod.rs +11 -11
  95. package/rust/core/parser/driver.rs +513 -490
  96. package/rust/core/parser/handler/arrow_call.rs +233 -227
  97. package/rust/core/parser/handler/at.rs +245 -162
  98. package/rust/core/parser/handler/bank.rs +94 -69
  99. package/rust/core/parser/handler/condition.rs +80 -74
  100. package/rust/core/parser/handler/dot.rs +143 -135
  101. package/rust/core/parser/handler/identifier/automate.rs +257 -194
  102. package/rust/core/parser/handler/identifier/call.rs +91 -88
  103. package/rust/core/parser/handler/identifier/emit.rs +66 -0
  104. package/rust/core/parser/handler/identifier/function.rs +100 -91
  105. package/rust/core/parser/handler/identifier/group.rs +85 -75
  106. package/rust/core/parser/handler/identifier/let_.rs +158 -143
  107. package/rust/core/parser/handler/identifier/mod.rs +54 -56
  108. package/rust/core/parser/handler/identifier/on.rs +98 -0
  109. package/rust/core/parser/handler/identifier/print.rs +52 -29
  110. package/rust/core/parser/handler/identifier/sleep.rs +36 -33
  111. package/rust/core/parser/handler/identifier/spawn.rs +91 -88
  112. package/rust/core/parser/handler/identifier/synth.rs +65 -63
  113. package/rust/core/parser/handler/loop_.rs +170 -89
  114. package/rust/core/parser/handler/mod.rs +8 -8
  115. package/rust/core/parser/handler/tempo.rs +53 -47
  116. package/rust/core/parser/mod.rs +4 -4
  117. package/rust/core/parser/statement.rs +142 -113
  118. package/rust/core/plugin/loader.rs +123 -48
  119. package/rust/core/plugin/mod.rs +2 -1
  120. package/rust/core/plugin/runner.rs +296 -0
  121. package/rust/core/preprocessor/loader.rs +515 -326
  122. package/rust/core/preprocessor/mod.rs +4 -4
  123. package/rust/core/preprocessor/module.rs +60 -58
  124. package/rust/core/preprocessor/processor.rs +99 -101
  125. package/rust/core/preprocessor/resolver/bank.rs +51 -48
  126. package/rust/core/preprocessor/resolver/call.rs +100 -101
  127. package/rust/core/preprocessor/resolver/condition.rs +97 -97
  128. package/rust/core/preprocessor/resolver/driver.rs +310 -280
  129. package/rust/core/preprocessor/resolver/function.rs +69 -68
  130. package/rust/core/preprocessor/resolver/group.rs +96 -91
  131. package/rust/core/preprocessor/resolver/let_.rs +32 -28
  132. package/rust/core/preprocessor/resolver/loop_.rs +320 -121
  133. package/rust/core/preprocessor/resolver/mod.rs +15 -15
  134. package/rust/core/preprocessor/resolver/spawn.rs +76 -73
  135. package/rust/core/preprocessor/resolver/synth.rs +56 -50
  136. package/rust/core/preprocessor/resolver/tempo.rs +50 -49
  137. package/rust/core/preprocessor/resolver/trigger.rs +113 -115
  138. package/rust/core/preprocessor/resolver/value.rs +81 -81
  139. package/rust/core/shared/duration.rs +9 -9
  140. package/rust/core/shared/mod.rs +3 -3
  141. package/rust/core/shared/value.rs +35 -32
  142. package/rust/core/store/function.rs +34 -34
  143. package/rust/core/store/global.rs +55 -38
  144. package/rust/core/store/mod.rs +5 -5
  145. package/rust/core/store/variable.rs +37 -34
  146. package/rust/core/utils/mod.rs +2 -2
  147. package/rust/core/utils/path.rs +37 -31
  148. package/rust/core/utils/validation.rs +35 -36
  149. package/rust/installer/addon.rs +84 -80
  150. package/rust/installer/bank.rs +62 -65
  151. package/rust/installer/mod.rs +5 -5
  152. package/rust/installer/plugin.rs +54 -55
  153. package/rust/installer/utils.rs +56 -56
  154. package/rust/lib.rs +156 -164
  155. package/rust/main.rs +250 -144
  156. package/rust/utils/error.rs +200 -51
  157. package/rust/utils/file.rs +38 -35
  158. package/rust/utils/first_usage.rs +76 -0
  159. package/rust/utils/logger.rs +195 -143
  160. package/rust/utils/mod.rs +9 -7
  161. package/rust/utils/signature.rs +19 -17
  162. package/rust/utils/spinner.rs +22 -19
  163. package/rust/utils/telemetry.rs +292 -0
  164. package/rust/utils/watcher.rs +34 -33
  165. package/templates/minimal/README.md +97 -121
  166. package/templates/welcome/README.md +97 -121
  167. package/typescript/bin/index.ts +19 -5
  168. package/typescript/index.ts +3 -1
  169. package/typescript/scripts/postbuild.ts +10 -6
  170. package/typescript/scripts/postinstall.ts +56 -0
  171. package/typescript/scripts/version/bump.ts +0 -1
  172. package/typescript/scripts/version/index.ts +0 -1
  173. package/out-tsc/bin/devalang.exe +0 -0
@@ -0,0 +1,66 @@
1
+ use crate::core::{
2
+ lexer::token::TokenKind,
3
+ parser::{
4
+ driver::Parser,
5
+ statement::{Statement, StatementKind},
6
+ },
7
+ shared::value::Value,
8
+ store::global::GlobalStore,
9
+ };
10
+
11
+ // Syntax:
12
+ // emit <event> [<payload>]
13
+ pub fn parse_emit_token(
14
+ parser: &mut Parser,
15
+ current: crate::core::lexer::token::Token,
16
+ _global_store: &mut GlobalStore,
17
+ ) -> Statement {
18
+ parser.advance(); // consume 'emit'
19
+
20
+ let Some(ev) = parser.peek_clone() else {
21
+ return Statement::error(current, "Expected event name after 'emit'".into());
22
+ };
23
+ if ev.kind != TokenKind::Identifier {
24
+ return Statement::error(ev.clone(), "Expected identifier as event name".into());
25
+ }
26
+ let event_name = ev.lexeme.clone();
27
+ parser.advance(); // consume event name
28
+
29
+ // Optional payload on same line: number|string|identifier|map|array
30
+ let mut payload: Option<Value> = None;
31
+ if let Some(tok) = parser.peek_clone() {
32
+ if tok.line == ev.line {
33
+ let val = match tok.kind {
34
+ TokenKind::String => {
35
+ parser.advance();
36
+ Value::String(tok.lexeme.clone())
37
+ }
38
+ TokenKind::Number => {
39
+ parser.advance();
40
+ Value::Number(tok.lexeme.parse().unwrap_or(0.0))
41
+ }
42
+ TokenKind::Identifier => {
43
+ parser.advance();
44
+ Value::Identifier(tok.lexeme.clone())
45
+ }
46
+ TokenKind::LBrace => parser.parse_map_value().unwrap_or(Value::Null),
47
+ TokenKind::LBracket => parser.parse_array_value().unwrap_or(Value::Null),
48
+ _ => Value::Null,
49
+ };
50
+ if val != Value::Null {
51
+ payload = Some(val);
52
+ }
53
+ }
54
+ }
55
+
56
+ Statement {
57
+ kind: StatementKind::Emit {
58
+ event: event_name,
59
+ payload: payload.clone(),
60
+ },
61
+ value: payload.unwrap_or(Value::Null),
62
+ indent: current.indent,
63
+ line: current.line,
64
+ column: current.column,
65
+ }
66
+ }
@@ -1,91 +1,100 @@
1
- use crate::core::{
2
- lexer::{ token::TokenKind },
3
- parser::{ statement::{ Statement, StatementKind }, driver::Parser },
4
- shared::value::Value,
5
- store::global::GlobalStore,
6
- };
7
-
8
- pub fn parse_function_token(parser: &mut Parser, global_store: &mut GlobalStore) -> Statement {
9
- parser.advance(); // consume 'fn'
10
-
11
- let fn_token = match parser.previous_clone() {
12
- Some(tok) => tok,
13
- None => return Statement::unknown(),
14
- };
15
-
16
- let name_token = match parser.peek_clone() {
17
- Some(tok) => tok,
18
- None => return Statement::error(fn_token, "Expected function name after 'fn'".to_string()),
19
- };
20
-
21
- if name_token.kind != TokenKind::Identifier {
22
- return Statement::error(
23
- name_token.clone(),
24
- "Expected function name to be an identifier".to_string()
25
- );
26
- }
27
-
28
- let function_name = name_token.lexeme.clone();
29
- parser.advance(); // consume function name
30
-
31
- let mut parameters = Vec::new();
32
-
33
- // Expect '('
34
- if parser.peek_kind() != Some(TokenKind::LParen) {
35
- return Statement::error(name_token.clone(), "Expected '(' after function name".to_string());
36
- }
37
- parser.advance(); // consume '('
38
-
39
- // Parse parameters until ')'
40
- let tokens = parser.collect_until(|t| t.kind == TokenKind::RParen || t.kind == TokenKind::EOF);
41
- for token in tokens {
42
- if token.kind == TokenKind::Identifier {
43
- parameters.push(token.lexeme.clone());
44
- }
45
- }
46
-
47
- if parser.peek_kind() == Some(TokenKind::RParen) {
48
- parser.advance(); // consume ')'
49
- } else {
50
- return Statement::error(name_token.clone(), "Expected ')' after parameters".to_string());
51
- }
52
-
53
- // Expect colon
54
- if parser.peek_kind() != Some(TokenKind::Colon) {
55
- return Statement::error(name_token.clone(), "Expected ':' after ')'".to_string());
56
- }
57
- parser.advance(); // consume ':'
58
-
59
- // Collect ALL tokens indented after this line until Dedent
60
- let base_indent = fn_token.indent;
61
- let mut body_tokens = Vec::new();
62
-
63
- while let Some(tok) = parser.peek() {
64
- if tok.kind == TokenKind::Dedent && tok.indent <= base_indent {
65
- break;
66
- }
67
- body_tokens.push(parser.advance().unwrap().clone());
68
- }
69
-
70
- // Parse those tokens into block statements
71
- let body = parser.parse_block(body_tokens.clone(), global_store);
72
-
73
- // Skip Dedent if present
74
- if let Some(tok) = parser.peek() {
75
- if tok.kind == TokenKind::Dedent {
76
- parser.advance();
77
- }
78
- }
79
-
80
- Statement {
81
- kind: StatementKind::Function {
82
- name: function_name.clone(),
83
- parameters: parameters.clone(),
84
- body: body.clone(),
85
- },
86
- value: Value::Null,
87
- indent: fn_token.indent,
88
- line: fn_token.line,
89
- column: fn_token.column,
90
- }
91
- }
1
+ use crate::core::{
2
+ lexer::token::TokenKind,
3
+ parser::{
4
+ driver::Parser,
5
+ statement::{Statement, StatementKind},
6
+ },
7
+ shared::value::Value,
8
+ store::global::GlobalStore,
9
+ };
10
+
11
+ pub fn parse_function_token(parser: &mut Parser, global_store: &mut GlobalStore) -> Statement {
12
+ parser.advance(); // consume 'fn'
13
+
14
+ let fn_token = match parser.previous_clone() {
15
+ Some(tok) => tok,
16
+ None => return Statement::unknown(),
17
+ };
18
+
19
+ let name_token = match parser.peek_clone() {
20
+ Some(tok) => tok,
21
+ None => return Statement::error(fn_token, "Expected function name after 'fn'".to_string()),
22
+ };
23
+
24
+ if name_token.kind != TokenKind::Identifier {
25
+ return Statement::error(
26
+ name_token.clone(),
27
+ "Expected function name to be an identifier".to_string(),
28
+ );
29
+ }
30
+
31
+ let function_name = name_token.lexeme.clone();
32
+ parser.advance(); // consume function name
33
+
34
+ let mut parameters = Vec::new();
35
+
36
+ // Expect '('
37
+ if parser.peek_kind() != Some(TokenKind::LParen) {
38
+ return Statement::error(
39
+ name_token.clone(),
40
+ "Expected '(' after function name".to_string(),
41
+ );
42
+ }
43
+ parser.advance(); // consume '('
44
+
45
+ // Parse parameters until ')'
46
+ let tokens = parser.collect_until(|t| t.kind == TokenKind::RParen || t.kind == TokenKind::EOF);
47
+ for token in tokens {
48
+ if token.kind == TokenKind::Identifier {
49
+ parameters.push(token.lexeme.clone());
50
+ }
51
+ }
52
+
53
+ if parser.peek_kind() == Some(TokenKind::RParen) {
54
+ parser.advance(); // consume ')'
55
+ } else {
56
+ return Statement::error(
57
+ name_token.clone(),
58
+ "Expected ')' after parameters".to_string(),
59
+ );
60
+ }
61
+
62
+ // Expect colon
63
+ if parser.peek_kind() != Some(TokenKind::Colon) {
64
+ return Statement::error(name_token.clone(), "Expected ':' after ')'".to_string());
65
+ }
66
+ parser.advance(); // consume ':'
67
+
68
+ // Collect ALL tokens indented after this line until Dedent
69
+ let base_indent = fn_token.indent;
70
+ let mut body_tokens = Vec::new();
71
+
72
+ while let Some(tok) = parser.peek() {
73
+ if tok.kind == TokenKind::Dedent && tok.indent <= base_indent {
74
+ break;
75
+ }
76
+ body_tokens.push(parser.advance().unwrap().clone());
77
+ }
78
+
79
+ // Parse those tokens into block statements
80
+ let body = parser.parse_block(body_tokens.clone(), global_store);
81
+
82
+ // Skip Dedent if present
83
+ if let Some(tok) = parser.peek() {
84
+ if tok.kind == TokenKind::Dedent {
85
+ parser.advance();
86
+ }
87
+ }
88
+
89
+ Statement {
90
+ kind: StatementKind::Function {
91
+ name: function_name.clone(),
92
+ parameters: parameters.clone(),
93
+ body: body.clone(),
94
+ },
95
+ value: Value::Null,
96
+ indent: fn_token.indent,
97
+ line: fn_token.line,
98
+ column: fn_token.column,
99
+ }
100
+ }
@@ -1,75 +1,85 @@
1
- use crate::core::{
2
- lexer::token::{ Token, TokenKind },
3
- parser::{ statement::{ Statement, StatementKind }, driver::Parser },
4
- shared::value::Value,
5
- store::global::GlobalStore,
6
- };
7
- use std::collections::HashMap;
8
-
9
- pub fn parse_group_token(
10
- parser: &mut Parser,
11
- current_token: Token,
12
- global_store: &mut GlobalStore
13
- ) -> Statement {
14
- parser.advance(); // consume "group"
15
-
16
- let Some(identifier_token) = parser.peek_clone() else {
17
- return Statement::error(current_token, "Expected identifier after 'group'".to_string());
18
- };
19
-
20
- if identifier_token.kind != TokenKind::Identifier && identifier_token.kind != TokenKind::String {
21
- return Statement::error(identifier_token, "Expected valid identifier".to_string());
22
- }
23
-
24
- parser.advance(); // consume identifier
25
-
26
- let Some(colon_token) = parser.peek_clone() else {
27
- return Statement::error(
28
- identifier_token,
29
- "Expected ':' after group identifier".to_string()
30
- );
31
- };
32
-
33
- if colon_token.kind != TokenKind::Colon {
34
- return Statement::error(
35
- colon_token.clone(),
36
- "Expected ':' after group identifier".to_string()
37
- );
38
- }
39
-
40
- parser.advance(); // consume ':'
41
-
42
- let base_indent = current_token.indent;
43
-
44
- // Clone without consuming tokens
45
- let mut index = parser.token_index;
46
- let mut tokens_inside_group = Vec::new();
47
-
48
- while index < parser.tokens.len() {
49
- let token = parser.tokens[index].clone();
50
-
51
- if token.indent <= base_indent && token.kind != TokenKind::Newline {
52
- break;
53
- }
54
-
55
- tokens_inside_group.push(token);
56
- index += 1;
57
- }
58
-
59
- // Advance index once to skip the processed tokens
60
- parser.token_index = index;
61
-
62
- let body = parser.parse_block(tokens_inside_group, global_store);
63
-
64
- let mut value_map = HashMap::new();
65
- value_map.insert("identifier".to_string(), Value::String(identifier_token.lexeme.clone()));
66
- value_map.insert("body".to_string(), Value::Block(body));
67
-
68
- return Statement {
69
- kind: StatementKind::Group,
70
- value: Value::Map(value_map),
71
- indent: current_token.indent,
72
- line: current_token.line,
73
- column: current_token.column,
74
- };
75
- }
1
+ use crate::core::{
2
+ lexer::token::{Token, TokenKind},
3
+ parser::{
4
+ driver::Parser,
5
+ statement::{Statement, StatementKind},
6
+ },
7
+ shared::value::Value,
8
+ store::global::GlobalStore,
9
+ };
10
+ use std::collections::HashMap;
11
+
12
+ pub fn parse_group_token(
13
+ parser: &mut Parser,
14
+ current_token: Token,
15
+ global_store: &mut GlobalStore,
16
+ ) -> Statement {
17
+ parser.advance(); // consume "group"
18
+
19
+ let Some(identifier_token) = parser.peek_clone() else {
20
+ return Statement::error(
21
+ current_token,
22
+ "Expected identifier after 'group'".to_string(),
23
+ );
24
+ };
25
+
26
+ if identifier_token.kind != TokenKind::Identifier && identifier_token.kind != TokenKind::String
27
+ {
28
+ return Statement::error(identifier_token, "Expected valid identifier".to_string());
29
+ }
30
+
31
+ parser.advance(); // consume identifier
32
+
33
+ let Some(colon_token) = parser.peek_clone() else {
34
+ return Statement::error(
35
+ identifier_token,
36
+ "Expected ':' after group identifier".to_string(),
37
+ );
38
+ };
39
+
40
+ if colon_token.kind != TokenKind::Colon {
41
+ return Statement::error(
42
+ colon_token.clone(),
43
+ "Expected ':' after group identifier".to_string(),
44
+ );
45
+ }
46
+
47
+ parser.advance(); // consume ':'
48
+
49
+ let base_indent = current_token.indent;
50
+
51
+ // Clone without consuming tokens
52
+ let mut index = parser.token_index;
53
+ let mut tokens_inside_group = Vec::new();
54
+
55
+ while index < parser.tokens.len() {
56
+ let token = parser.tokens[index].clone();
57
+
58
+ if token.indent <= base_indent && token.kind != TokenKind::Newline {
59
+ break;
60
+ }
61
+
62
+ tokens_inside_group.push(token);
63
+ index += 1;
64
+ }
65
+
66
+ // Advance index once to skip the processed tokens
67
+ parser.token_index = index;
68
+
69
+ let body = parser.parse_block(tokens_inside_group, global_store);
70
+
71
+ let mut value_map = HashMap::new();
72
+ value_map.insert(
73
+ "identifier".to_string(),
74
+ Value::String(identifier_token.lexeme.clone()),
75
+ );
76
+ value_map.insert("body".to_string(), Value::Block(body));
77
+
78
+ return Statement {
79
+ kind: StatementKind::Group,
80
+ value: Value::Map(value_map),
81
+ indent: current_token.indent,
82
+ line: current_token.line,
83
+ column: current_token.column,
84
+ };
85
+ }