2024-03-06 20:36:58 +00:00
|
|
|
//! Command line interface for the dust programming language.
|
2024-03-20 08:42:13 +00:00
|
|
|
mod cli;
|
2024-03-06 20:36:58 +00:00
|
|
|
|
|
|
|
use clap::Parser;
|
2024-03-20 08:42:13 +00:00
|
|
|
use cli::run_shell;
|
2024-03-06 20:36:58 +00:00
|
|
|
use colored::Colorize;
|
|
|
|
|
2024-03-20 08:42:13 +00:00
|
|
|
use std::{
|
|
|
|
fs::read_to_string,
|
|
|
|
io::{stderr, Write},
|
|
|
|
};
|
2024-03-06 20:36:58 +00:00
|
|
|
|
2024-03-23 12:15:48 +00:00
|
|
|
use dust_lang::{context::Context, interpret};
|
2024-03-06 20:36:58 +00:00
|
|
|
|
|
|
|
/// Command-line arguments to be parsed.
|
|
|
|
#[derive(Parser, Debug)]
|
|
|
|
#[command(author, version, about, long_about = None)]
|
|
|
|
struct Args {
|
|
|
|
/// Dust source code to evaluate.
|
|
|
|
#[arg(short, long)]
|
|
|
|
command: Option<String>,
|
|
|
|
|
|
|
|
/// Location of the file to run.
|
|
|
|
path: Option<String>,
|
|
|
|
}
|
|
|
|
|
|
|
|
fn main() {
|
|
|
|
env_logger::Builder::from_env("DUST_LOG")
|
|
|
|
.format(|buffer, record| {
|
|
|
|
let args = record.args();
|
|
|
|
let log_level = record.level().to_string().bold();
|
|
|
|
let timestamp = buffer.timestamp_seconds().to_string().dimmed();
|
|
|
|
|
|
|
|
writeln!(buffer, "[{log_level} {timestamp}] {args}")
|
|
|
|
})
|
|
|
|
.init();
|
|
|
|
|
|
|
|
let args = Args::parse();
|
|
|
|
let context = Context::new();
|
|
|
|
|
|
|
|
let source = if let Some(path) = &args.path {
|
|
|
|
read_to_string(path).unwrap()
|
|
|
|
} else if let Some(command) = args.command {
|
|
|
|
command
|
|
|
|
} else {
|
2024-03-20 08:42:13 +00:00
|
|
|
return run_shell(context);
|
2024-03-06 20:36:58 +00:00
|
|
|
};
|
|
|
|
|
2024-03-23 12:15:48 +00:00
|
|
|
let eval_result = interpret(&source);
|
2024-03-06 20:36:58 +00:00
|
|
|
|
|
|
|
match eval_result {
|
|
|
|
Ok(value) => {
|
2024-03-08 17:24:11 +00:00
|
|
|
if let Some(value) = value {
|
2024-03-06 20:36:58 +00:00
|
|
|
println!("{value}")
|
|
|
|
}
|
|
|
|
}
|
2024-03-07 03:15:35 +00:00
|
|
|
Err(errors) => {
|
|
|
|
for error in errors {
|
2024-03-20 12:36:18 +00:00
|
|
|
let report = error.build_report(&source).unwrap();
|
2024-03-20 08:42:13 +00:00
|
|
|
|
|
|
|
stderr().write_all(&report).unwrap();
|
2024-03-18 07:24:41 +00:00
|
|
|
}
|
2024-03-07 03:15:35 +00:00
|
|
|
}
|
2024-03-06 20:36:58 +00:00
|
|
|
}
|
|
|
|
}
|