@devaloop/devalang 0.0.1-alpha.2 → 0.0.1-alpha.4
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 +1 -1
- package/Cargo.toml +46 -46
- package/README.md +48 -30
- package/docs/CHANGELOG.md +28 -6
- package/docs/COMMANDS.md +31 -0
- package/docs/CONFIG.md +6 -4
- package/docs/ROADMAP.md +5 -1
- package/docs/TODO.md +10 -35
- package/examples/exported.deva +1 -1
- package/examples/index.deva +8 -1
- package/examples/samples/hat-808.wav +0 -0
- package/out-tsc/bin/devalang.exe +0 -0
- package/package.json +41 -42
- package/project-version.json +5 -5
- package/rust/audio/engine.rs +130 -0
- package/rust/audio/interpreter.rs +143 -0
- package/rust/audio/loader.rs +46 -0
- package/rust/audio/mod.rs +5 -1
- package/rust/audio/player.rs +54 -0
- package/rust/audio/render.rs +57 -0
- package/rust/cli/build.rs +73 -45
- package/rust/cli/check.rs +47 -111
- package/rust/cli/init.rs +1 -1
- package/rust/cli/mod.rs +203 -2
- package/rust/cli/play.rs +191 -0
- package/rust/{utils/config.rs → config/loader.rs} +3 -2
- package/rust/config/mod.rs +16 -0
- package/rust/core/builder/mod.rs +69 -27
- package/rust/core/debugger/lexer.rs +27 -0
- package/rust/core/debugger/mod.rs +12 -49
- package/rust/core/debugger/preprocessor.rs +27 -0
- package/rust/core/error/mod.rs +60 -0
- package/rust/core/lexer/{at.rs → handler/at.rs} +1 -1
- package/rust/core/lexer/{brace.rs → handler/brace.rs} +1 -1
- package/rust/core/lexer/{colon.rs → handler/colon.rs} +1 -1
- package/rust/core/lexer/{comment.rs → handler/comment.rs} +3 -3
- package/rust/core/lexer/{dot.rs → handler/dot.rs} +1 -1
- package/rust/core/lexer/{equal.rs → handler/equal.rs} +1 -1
- package/rust/core/lexer/{identifier.rs → handler/identifier.rs} +1 -1
- package/rust/core/lexer/{indent.rs → handler/indent.rs} +10 -5
- package/rust/core/lexer/handler/mod.rs +238 -0
- package/rust/core/lexer/{newline.rs → handler/newline.rs} +6 -10
- package/rust/core/lexer/{number.rs → handler/number.rs} +1 -1
- package/rust/core/lexer/handler/string.rs +66 -0
- package/rust/core/lexer/mod.rs +25 -14
- package/rust/core/lexer/token.rs +55 -0
- package/rust/core/mod.rs +5 -2
- package/rust/core/parser/handler/at.rs +166 -0
- package/rust/core/parser/handler/bank.rs +38 -0
- package/rust/core/parser/handler/dot.rs +112 -0
- package/rust/core/parser/handler/identifier.rs +134 -0
- package/rust/core/parser/handler/loop_.rs +55 -0
- package/rust/core/parser/handler/mod.rs +6 -0
- package/rust/core/parser/handler/tempo.rs +47 -0
- package/rust/core/parser/mod.rs +204 -166
- package/rust/core/parser/statement.rs +91 -0
- package/rust/core/preprocessor/loader.rs +116 -0
- package/rust/core/preprocessor/mod.rs +2 -24
- package/rust/core/preprocessor/module.rs +37 -56
- package/rust/core/preprocessor/processor.rs +41 -0
- package/rust/core/preprocessor/resolver/bank.rs +38 -51
- package/rust/core/preprocessor/resolver/loop_.rs +126 -65
- package/rust/core/preprocessor/resolver/mod.rs +119 -80
- package/rust/core/preprocessor/resolver/tempo.rs +40 -61
- package/rust/core/preprocessor/resolver/trigger.rs +93 -155
- package/rust/core/shared/duration.rs +8 -0
- package/rust/core/shared/mod.rs +2 -0
- package/rust/core/shared/value.rs +18 -0
- package/rust/core/store/export.rs +28 -0
- package/rust/core/store/global.rs +39 -0
- package/rust/core/store/import.rs +28 -0
- package/rust/core/store/mod.rs +4 -0
- package/rust/core/store/variable.rs +28 -0
- package/rust/core/utils/mod.rs +2 -0
- package/rust/core/utils/validation.rs +35 -0
- package/rust/lib.rs +0 -1
- package/rust/main.rs +22 -18
- package/rust/utils/logger.rs +69 -34
- package/rust/utils/mod.rs +3 -5
- package/rust/utils/watcher.rs +10 -2
- package/templates/minimal/.devalang +1 -1
- package/templates/welcome/.devalang +1 -1
- package/rust/core/lexer/bracket.rs +0 -41
- package/rust/core/lexer/driver.rs +0 -286
- package/rust/core/lexer/quote.rs +0 -61
- package/rust/core/parser/at.rs +0 -142
- package/rust/core/parser/bank.rs +0 -42
- package/rust/core/parser/dot.rs +0 -137
- package/rust/core/parser/identifer.rs +0 -91
- package/rust/core/parser/loop_.rs +0 -62
- package/rust/core/parser/tempo.rs +0 -42
- package/rust/core/parser/variable.rs +0 -129
- package/rust/core/preprocessor/dependencies.rs +0 -54
- package/rust/core/preprocessor/resolver/at.rs +0 -24
- package/rust/core/types/cli.rs +0 -182
- package/rust/core/types/config.rs +0 -15
- package/rust/core/types/mod.rs +0 -8
- package/rust/core/types/module.rs +0 -41
- package/rust/core/types/parser.rs +0 -73
- package/rust/core/types/statement.rs +0 -105
- package/rust/core/types/store.rs +0 -116
- package/rust/core/types/token.rs +0 -83
- package/rust/core/types/variable.rs +0 -32
- package/rust/runner/executer.rs +0 -44
- package/rust/runner/mod.rs +0 -1
- /package/rust/{utils → core/utils}/path.rs +0 -0
- /package/rust/utils/{loader.rs → spinner.rs} +0 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
use std::collections::HashMap;
|
|
2
|
+
|
|
3
|
+
use crate::core::shared::value::Value;
|
|
4
|
+
|
|
5
|
+
#[derive(Debug, Default, Clone, PartialEq)]
|
|
6
|
+
pub struct ExportTable {
|
|
7
|
+
pub exports: HashMap<String, Value>,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
impl ExportTable {
|
|
11
|
+
pub fn new() -> Self {
|
|
12
|
+
ExportTable {
|
|
13
|
+
exports: HashMap::new(),
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
pub fn add_export(&mut self, name: String, value: Value) {
|
|
18
|
+
self.exports.insert(name, value);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
pub fn get_export(&self, name: &str) -> Option<&Value> {
|
|
22
|
+
self.exports.get(name)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
pub fn remove_export(&mut self, name: &str) -> Option<Value> {
|
|
26
|
+
self.exports.remove(name)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
use std::collections::HashMap;
|
|
2
|
+
use crate::core::preprocessor::module::Module;
|
|
3
|
+
|
|
4
|
+
#[derive(Debug, Default, Clone)]
|
|
5
|
+
pub struct GlobalStore {
|
|
6
|
+
pub modules: HashMap<String, Module>,
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
impl GlobalStore {
|
|
10
|
+
pub fn new() -> Self {
|
|
11
|
+
GlobalStore {
|
|
12
|
+
modules: HashMap::new(),
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
pub fn resolve_all_imports(&mut self) {
|
|
17
|
+
for module in self.modules.values_mut() {
|
|
18
|
+
for (name, source_path) in &module.import_table.imports {
|
|
19
|
+
println!("Resolving import: {} from {:?}", name, source_path);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
pub fn insert_module(&mut self, path: String, module: Module) {
|
|
25
|
+
self.modules.insert(path, module);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
pub fn modules_mut(&mut self) -> &mut HashMap<String, Module> {
|
|
29
|
+
&mut self.modules
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
pub fn get_module(&self, path: &str) -> Option<&Module> {
|
|
33
|
+
self.modules.get(path)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
pub fn remove_module(&mut self, path: &str) -> Option<Module> {
|
|
37
|
+
self.modules.remove(path)
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
use std::collections::HashMap;
|
|
2
|
+
|
|
3
|
+
use crate::core::shared::value::Value;
|
|
4
|
+
|
|
5
|
+
#[derive(Debug, Default, Clone, PartialEq)]
|
|
6
|
+
pub struct ImportTable {
|
|
7
|
+
pub imports: HashMap<String, Value>,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
impl ImportTable {
|
|
11
|
+
pub fn new() -> Self {
|
|
12
|
+
ImportTable {
|
|
13
|
+
imports: HashMap::new(),
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
pub fn add_import(&mut self, name: String, value: Value) {
|
|
18
|
+
self.imports.insert(name, value);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
pub fn get_import(&self, name: &str) -> Option<&Value> {
|
|
22
|
+
self.imports.get(name)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
pub fn remove_import(&mut self, name: &str) -> Option<Value> {
|
|
26
|
+
self.imports.remove(name)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
use std::collections::HashMap;
|
|
2
|
+
|
|
3
|
+
use crate::core::shared::value::Value;
|
|
4
|
+
|
|
5
|
+
#[derive(Debug, Default, Clone, PartialEq)]
|
|
6
|
+
pub struct VariableTable {
|
|
7
|
+
pub variables: HashMap<String, Value>,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
impl VariableTable {
|
|
11
|
+
pub fn new() -> Self {
|
|
12
|
+
VariableTable {
|
|
13
|
+
variables: HashMap::new(),
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
pub fn set(&mut self, name: String, value: Value) {
|
|
18
|
+
self.variables.insert(name, value);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
pub fn get(&self, name: &str) -> Option<&Value> {
|
|
22
|
+
self.variables.get(name)
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
pub fn remove(&mut self, name: &str) -> Option<Value> {
|
|
26
|
+
self.variables.remove(name)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
use crate::core::{ preprocessor::module::Module, shared::value::Value, store::global::GlobalStore };
|
|
2
|
+
|
|
3
|
+
pub fn is_valid_entity(entity: &str, module: &Module, global_store: &GlobalStore) -> bool {
|
|
4
|
+
let built_ins = ["kick", "snare", "hat", "clap"];
|
|
5
|
+
|
|
6
|
+
if built_ins.contains(&entity) {
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
if let Some(val) = module.variable_table.get(entity) {
|
|
11
|
+
match val {
|
|
12
|
+
Value::Sample(_) => true,
|
|
13
|
+
_ => false,
|
|
14
|
+
}
|
|
15
|
+
} else {
|
|
16
|
+
false
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
pub fn is_valid_identifier(ident: &str, module: &Module) -> bool {
|
|
21
|
+
let built_ins = ["auto"];
|
|
22
|
+
|
|
23
|
+
if built_ins.contains(&ident) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if let Some(val) = module.variable_table.get(ident) {
|
|
28
|
+
match val {
|
|
29
|
+
Value::Identifier(_) => true,
|
|
30
|
+
_ => false,
|
|
31
|
+
}
|
|
32
|
+
} else {
|
|
33
|
+
false
|
|
34
|
+
}
|
|
35
|
+
}
|
package/rust/lib.rs
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
// TODO WebAssembly support
|
package/rust/main.rs
CHANGED
|
@@ -1,59 +1,63 @@
|
|
|
1
1
|
pub mod core;
|
|
2
2
|
pub mod cli;
|
|
3
|
-
pub mod runner;
|
|
4
|
-
pub mod audio;
|
|
5
3
|
pub mod utils;
|
|
4
|
+
pub mod config;
|
|
5
|
+
pub mod audio;
|
|
6
6
|
|
|
7
|
-
use std::
|
|
7
|
+
use std::io;
|
|
8
|
+
use cli::{ Cli };
|
|
8
9
|
use clap::Parser;
|
|
9
10
|
use crate::{
|
|
10
11
|
cli::{
|
|
11
12
|
build::handle_build_command,
|
|
12
13
|
check::handle_check_command,
|
|
13
14
|
init::handle_init_command,
|
|
15
|
+
play::handle_play_command,
|
|
14
16
|
template::{ handle_template_info_command, handle_template_list_command },
|
|
17
|
+
Commands,
|
|
18
|
+
TemplateCommand,
|
|
15
19
|
},
|
|
16
|
-
|
|
17
|
-
utils::{ config::load_config, logger::log_message },
|
|
20
|
+
config::{ loader::load_config, Config },
|
|
18
21
|
};
|
|
19
22
|
|
|
20
23
|
fn main() -> io::Result<()> {
|
|
21
24
|
let cli: Cli = Cli::parse();
|
|
22
|
-
let mut config: Option<
|
|
25
|
+
let mut config: Option<Config> = None;
|
|
23
26
|
|
|
24
27
|
if !cli.no_config {
|
|
25
28
|
config = load_config(None);
|
|
26
29
|
} else {
|
|
27
|
-
|
|
30
|
+
println!("No configuration file loaded. Running with arguments only.");
|
|
28
31
|
}
|
|
29
32
|
|
|
30
33
|
match cli.command {
|
|
31
|
-
|
|
34
|
+
Commands::Init { name, template } => {
|
|
32
35
|
handle_init_command(name, template);
|
|
33
36
|
}
|
|
34
37
|
|
|
35
|
-
|
|
38
|
+
Commands::Template { command } =>
|
|
36
39
|
match command {
|
|
37
|
-
|
|
40
|
+
TemplateCommand::List => {
|
|
38
41
|
handle_template_list_command();
|
|
39
42
|
}
|
|
40
|
-
|
|
43
|
+
TemplateCommand::Info { name } => {
|
|
41
44
|
handle_template_info_command(name);
|
|
42
45
|
}
|
|
43
46
|
}
|
|
44
47
|
|
|
45
|
-
|
|
48
|
+
Commands::Check { entry, output, watch, compilation_mode, debug } => {
|
|
49
|
+
handle_check_command(config, entry, output, watch);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
Commands::Build { entry, output, watch, compilation_mode, debug, compress } => {
|
|
46
53
|
handle_build_command(config, entry, output, watch);
|
|
47
54
|
}
|
|
48
55
|
|
|
49
|
-
|
|
50
|
-
|
|
56
|
+
Commands::Play { entry, output, watch, repeat } => {
|
|
57
|
+
handle_play_command(config, entry, output, watch, repeat);
|
|
51
58
|
}
|
|
52
59
|
|
|
53
|
-
|
|
54
|
-
// CliCommands::Play {} => {
|
|
55
|
-
// log_message("Command 'play' is not implemented yet.", "WARNING");
|
|
56
|
-
// }
|
|
60
|
+
_ => {}
|
|
57
61
|
}
|
|
58
62
|
|
|
59
63
|
Ok(())
|
package/rust/utils/logger.rs
CHANGED
|
@@ -1,49 +1,84 @@
|
|
|
1
|
-
use crossterm::style::{Attribute, Color, ResetColor, SetAttribute, SetForegroundColor};
|
|
1
|
+
use crossterm::style::{ Attribute, Color, ResetColor, SetAttribute, SetForegroundColor };
|
|
2
2
|
use std::{ fmt::Write };
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
#[derive(Debug, Clone, PartialEq)]
|
|
5
|
+
pub enum LogLevel {
|
|
6
|
+
Success,
|
|
7
|
+
Error,
|
|
8
|
+
Info,
|
|
9
|
+
Warning,
|
|
10
|
+
Watcher,
|
|
11
|
+
Debug,
|
|
7
12
|
}
|
|
8
13
|
|
|
9
|
-
|
|
10
|
-
|
|
14
|
+
#[derive(Debug, Clone)]
|
|
15
|
+
pub struct Logger {}
|
|
11
16
|
|
|
12
|
-
|
|
13
|
-
|
|
17
|
+
impl Logger {
|
|
18
|
+
pub fn new() -> Self {
|
|
19
|
+
Logger {}
|
|
20
|
+
}
|
|
14
21
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
22
|
+
pub fn log_message(&self, level: LogLevel, message: &str) {
|
|
23
|
+
let formatted_status = self.format_status(level);
|
|
24
|
+
println!("🦊 {} {} {}", self.language_signature(), formatted_status, message);
|
|
25
|
+
}
|
|
19
26
|
|
|
20
|
-
|
|
21
|
-
|
|
27
|
+
pub fn log_error_with_stacktrace(&self, message: &str, stacktrace: &str) {
|
|
28
|
+
let formatted_status = self.format_status(LogLevel::Error);
|
|
29
|
+
println!("🦊 {} {} {}", self.language_signature(), formatted_status, message);
|
|
30
|
+
println!(" ↳ {}", stacktrace);
|
|
31
|
+
}
|
|
22
32
|
|
|
23
|
-
|
|
33
|
+
fn language_signature(&self) -> String {
|
|
34
|
+
let mut s = String::new();
|
|
24
35
|
|
|
25
|
-
|
|
26
|
-
|
|
36
|
+
write!(&mut s, "{}", SetForegroundColor(Color::Grey)).unwrap();
|
|
37
|
+
s.push('[');
|
|
38
|
+
|
|
39
|
+
write!(&mut s, "{}", SetForegroundColor(Color::Rgb { r: 29, g: 211, b: 176 })).unwrap();
|
|
40
|
+
write!(&mut s, "{}", SetAttribute(Attribute::Bold)).unwrap();
|
|
41
|
+
s.push_str("Devalang");
|
|
42
|
+
write!(&mut s, "{}", SetAttribute(Attribute::Reset)).unwrap();
|
|
43
|
+
|
|
44
|
+
write!(&mut s, "{}", SetForegroundColor(Color::Grey)).unwrap();
|
|
45
|
+
s.push(']');
|
|
46
|
+
|
|
47
|
+
write!(&mut s, "{}", ResetColor).unwrap();
|
|
48
|
+
|
|
49
|
+
s
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
fn format_status(&self, level: LogLevel) -> String {
|
|
53
|
+
let mut s = String::new();
|
|
27
54
|
|
|
28
|
-
|
|
29
|
-
|
|
55
|
+
let color = match level {
|
|
56
|
+
LogLevel::Success => Color::Rgb { r: 76, g: 175, b: 80 },
|
|
57
|
+
LogLevel::Error => Color::Rgb { r: 244, g: 67, b: 54 },
|
|
58
|
+
LogLevel::Info => Color::Rgb { r: 33, g: 150, b: 243 },
|
|
59
|
+
LogLevel::Warning => Color::Rgb { r: 255, g: 152, b: 0 },
|
|
60
|
+
LogLevel::Watcher => Color::Rgb { r: 156, g: 39, b: 176 },
|
|
61
|
+
LogLevel::Debug => Color::Rgb { r: 103, g: 58, b: 183 },
|
|
62
|
+
};
|
|
30
63
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
64
|
+
let status = match level {
|
|
65
|
+
LogLevel::Success => "SUCCESS",
|
|
66
|
+
LogLevel::Error => "ERROR",
|
|
67
|
+
LogLevel::Info => "INFO",
|
|
68
|
+
LogLevel::Warning => "WARNING",
|
|
69
|
+
LogLevel::Watcher => "WATCHER",
|
|
70
|
+
LogLevel::Debug => "DEBUG",
|
|
71
|
+
};
|
|
38
72
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
73
|
+
s.push('[');
|
|
74
|
+
write!(&mut s, "{}", SetForegroundColor(color)).unwrap();
|
|
75
|
+
write!(&mut s, "{}", SetAttribute(Attribute::Bold)).unwrap();
|
|
76
|
+
s.push_str(status);
|
|
77
|
+
write!(&mut s, "{}", SetAttribute(Attribute::Reset)).unwrap();
|
|
78
|
+
s.push(']');
|
|
45
79
|
|
|
46
|
-
|
|
80
|
+
write!(&mut s, "{}", ResetColor).unwrap();
|
|
47
81
|
|
|
48
|
-
|
|
82
|
+
s
|
|
83
|
+
}
|
|
49
84
|
}
|
package/rust/utils/mod.rs
CHANGED
package/rust/utils/watcher.rs
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
use notify::{ Watcher, RecursiveMode, Config, RecommendedWatcher };
|
|
2
2
|
use std::sync::mpsc::channel;
|
|
3
3
|
|
|
4
|
+
use std::time::{ Duration, Instant };
|
|
5
|
+
|
|
4
6
|
pub fn watch_directory<F>(entry: String, callback: F) -> notify::Result<()>
|
|
5
7
|
where F: Fn() + Send + 'static
|
|
6
8
|
{
|
|
@@ -9,13 +11,19 @@ pub fn watch_directory<F>(entry: String, callback: F) -> notify::Result<()>
|
|
|
9
11
|
let mut watcher: RecommendedWatcher = Watcher::new(tx, Config::default())?;
|
|
10
12
|
watcher.watch(&entry.as_ref(), RecursiveMode::Recursive)?;
|
|
11
13
|
|
|
14
|
+
let mut last_trigger = Instant::now();
|
|
15
|
+
|
|
12
16
|
loop {
|
|
13
17
|
match rx.recv() {
|
|
14
18
|
Ok(_) => {
|
|
15
|
-
|
|
19
|
+
let now = Instant::now();
|
|
20
|
+
if now.duration_since(last_trigger) > Duration::from_millis(200) {
|
|
21
|
+
callback();
|
|
22
|
+
last_trigger = now;
|
|
23
|
+
}
|
|
16
24
|
}
|
|
17
25
|
Err(e) => {
|
|
18
|
-
eprintln!("Channel error
|
|
26
|
+
eprintln!("Channel error: {:?}", e);
|
|
19
27
|
break;
|
|
20
28
|
}
|
|
21
29
|
}
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
use crate::core::types::token::{ Token, TokenKind };
|
|
2
|
-
|
|
3
|
-
pub fn handle_rbracket_lexer(
|
|
4
|
-
char: char,
|
|
5
|
-
chars: &mut std::iter::Peekable<std::str::Chars>,
|
|
6
|
-
current_indent: &mut usize,
|
|
7
|
-
indent_stack: &mut Vec<usize>,
|
|
8
|
-
tokens: &mut Vec<Token>,
|
|
9
|
-
line: &mut usize,
|
|
10
|
-
column: &mut usize
|
|
11
|
-
) {
|
|
12
|
-
tokens.push(Token {
|
|
13
|
-
kind: TokenKind::RBracket,
|
|
14
|
-
lexeme: char.to_string(),
|
|
15
|
-
line: *line,
|
|
16
|
-
column: *column,
|
|
17
|
-
indent: *current_indent,
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
*column += 1;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
pub fn handle_lbracket_lexer(
|
|
24
|
-
char: char,
|
|
25
|
-
chars: &mut std::iter::Peekable<std::str::Chars>,
|
|
26
|
-
current_indent: &mut usize,
|
|
27
|
-
indent_stack: &mut Vec<usize>,
|
|
28
|
-
tokens: &mut Vec<Token>,
|
|
29
|
-
line: &mut usize,
|
|
30
|
-
column: &mut usize
|
|
31
|
-
) {
|
|
32
|
-
tokens.push(Token {
|
|
33
|
-
kind: TokenKind::LBracket,
|
|
34
|
-
lexeme: char.to_string(),
|
|
35
|
-
line: *line,
|
|
36
|
-
column: *column,
|
|
37
|
-
indent: *current_indent,
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
*column += 1;
|
|
41
|
-
}
|