Improve errors and built-ins
This commit is contained in:
parent
13c95dd12f
commit
b392a4c7aa
@ -45,7 +45,7 @@ impl BuiltInFunction {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn call(&self, arguments: Vec<Value>, context: &Context) -> Result<Action, RuntimeError> {
|
pub fn call(&self, arguments: Vec<Value>, _context: &Context) -> Result<Action, RuntimeError> {
|
||||||
match self {
|
match self {
|
||||||
// "INT_RANDOM_RANGE" => {
|
// "INT_RANDOM_RANGE" => {
|
||||||
// let range = arguments.get(0).unwrap();
|
// let range = arguments.get(0).unwrap();
|
||||||
@ -77,9 +77,6 @@ impl BuiltInFunction {
|
|||||||
|
|
||||||
Ok(Action::None)
|
Ok(Action::None)
|
||||||
}
|
}
|
||||||
_ => {
|
|
||||||
todo!()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,9 @@ pub fn std_context() -> Context {
|
|||||||
let mut interpreter = Interpreter::new(context.clone());
|
let mut interpreter = Interpreter::new(context.clone());
|
||||||
|
|
||||||
interpreter.run(include_str!("../../std/io.ds")).unwrap();
|
interpreter.run(include_str!("../../std/io.ds")).unwrap();
|
||||||
|
interpreter
|
||||||
|
.run(include_str!("../../std/thread.ds"))
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
context
|
context
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
use std::{fmt::Debug, hash::Hash, io, ops::Range, sync::PoisonError};
|
use std::{io, sync::PoisonError};
|
||||||
|
|
||||||
use ariadne::{Color, Fmt, Label, Report, ReportKind};
|
|
||||||
use chumsky::{prelude::Rich, span::Span};
|
use chumsky::{prelude::Rich, span::Span};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
@ -1,10 +1,4 @@
|
|||||||
use std::{
|
use std::{borrow::Cow, io::stderr, path::PathBuf, process::Command, rc::Rc};
|
||||||
borrow::Cow,
|
|
||||||
io::{stderr, Write},
|
|
||||||
path::PathBuf,
|
|
||||||
process::Command,
|
|
||||||
rc::Rc,
|
|
||||||
};
|
|
||||||
|
|
||||||
use ariadne::sources;
|
use ariadne::sources;
|
||||||
use dust_lang::{
|
use dust_lang::{
|
||||||
@ -20,7 +14,7 @@ use reedline::{
|
|||||||
|
|
||||||
use crate::error::Error;
|
use crate::error::Error;
|
||||||
|
|
||||||
pub fn run_shell(context: Context) {
|
pub fn run_shell(context: Context) -> Result<(), Error> {
|
||||||
let mut interpreter = Interpreter::new(context.clone());
|
let mut interpreter = Interpreter::new(context.clone());
|
||||||
let mut keybindings = default_emacs_keybindings();
|
let mut keybindings = default_emacs_keybindings();
|
||||||
|
|
||||||
@ -92,7 +86,7 @@ pub fn run_shell(context: Context) {
|
|||||||
Err(errors) => {
|
Err(errors) => {
|
||||||
let source_id = Rc::new("input".to_string());
|
let source_id = Rc::new("input".to_string());
|
||||||
let reports = Error::Dust { errors }
|
let reports = Error::Dust { errors }
|
||||||
.build_reports(source_id.clone(), &buffer)
|
.build_reports(source_id.clone())
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
for report in reports {
|
for report in reports {
|
||||||
@ -114,6 +108,8 @@ pub fn run_shell(context: Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
struct StarshipPrompt {
|
struct StarshipPrompt {
|
||||||
|
@ -1,14 +1,12 @@
|
|||||||
use ariadne::{Color, Fmt, Label, Report, ReportKind};
|
use ariadne::{Color, Fmt, Label, Report, ReportKind};
|
||||||
use clap::error;
|
|
||||||
use dust_lang::{
|
use dust_lang::{
|
||||||
abstract_tree::Type,
|
abstract_tree::Type,
|
||||||
error::{Error as DustError, RuntimeError, TypeConflict, ValidationError},
|
error::{Error as DustError, RuntimeError, TypeConflict, ValidationError},
|
||||||
};
|
};
|
||||||
use std::{
|
use std::{
|
||||||
fmt::{self, Debug, Display, Formatter},
|
fmt::{self, Display, Formatter},
|
||||||
io,
|
io,
|
||||||
ops::Range,
|
ops::Range,
|
||||||
path::Path,
|
|
||||||
rc::Rc,
|
rc::Rc,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -20,11 +18,16 @@ pub enum Error {
|
|||||||
Io(io::Error),
|
Io(io::Error),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<io::Error> for Error {
|
||||||
|
fn from(error: io::Error) -> Self {
|
||||||
|
Error::Io(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Error {
|
impl Error {
|
||||||
pub fn build_reports<'id>(
|
pub fn build_reports<'id>(
|
||||||
self,
|
self,
|
||||||
source_id: Rc<String>,
|
source_id: Rc<String>,
|
||||||
source: &str,
|
|
||||||
) -> Result<Vec<Report<'id, (Rc<String>, Range<usize>)>>, io::Error> {
|
) -> Result<Vec<Report<'id, (Rc<String>, Range<usize>)>>, io::Error> {
|
||||||
if let Error::Dust { errors } = self {
|
if let Error::Dust { errors } = self {
|
||||||
let mut reports = Vec::new();
|
let mut reports = Vec::new();
|
||||||
@ -241,3 +244,20 @@ impl Error {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl Display for Error {
|
||||||
|
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
|
||||||
|
match self {
|
||||||
|
Error::Dust { errors } => {
|
||||||
|
for error in errors {
|
||||||
|
writeln!(f, "{error:?}")?;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
Error::Io(io_error) => {
|
||||||
|
write!(f, "{io_error}")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -11,7 +11,6 @@ use error::Error;
|
|||||||
use std::{
|
use std::{
|
||||||
fs::read_to_string,
|
fs::read_to_string,
|
||||||
io::{stderr, Write},
|
io::{stderr, Write},
|
||||||
path::Path,
|
|
||||||
rc::Rc,
|
rc::Rc,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -47,7 +46,12 @@ fn main() {
|
|||||||
} else if let Some(command) = args.command {
|
} else if let Some(command) = args.command {
|
||||||
(command, Rc::new("input".to_string()))
|
(command, Rc::new("input".to_string()))
|
||||||
} else {
|
} else {
|
||||||
return run_shell(context);
|
match run_shell(context) {
|
||||||
|
Ok(_) => {}
|
||||||
|
Err(error) => eprintln!("{error}"),
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
};
|
};
|
||||||
|
|
||||||
let eval_result = interpret(&source);
|
let eval_result = interpret(&source);
|
||||||
@ -60,12 +64,25 @@ fn main() {
|
|||||||
}
|
}
|
||||||
Err(errors) => {
|
Err(errors) => {
|
||||||
let reports = Error::Dust { errors }
|
let reports = Error::Dust { errors }
|
||||||
.build_reports(source_id.clone(), &source)
|
.build_reports(source_id.clone())
|
||||||
.unwrap();
|
.unwrap();
|
||||||
|
|
||||||
for report in reports {
|
for report in reports {
|
||||||
report
|
report
|
||||||
.write_for_stdout(sources([(source_id.clone(), source.clone())]), stderr())
|
.write_for_stdout(
|
||||||
|
sources([
|
||||||
|
(source_id.clone(), source.as_str()),
|
||||||
|
(
|
||||||
|
Rc::new("std/io.ds".to_string()),
|
||||||
|
include_str!("../../std/io.ds"),
|
||||||
|
),
|
||||||
|
(
|
||||||
|
Rc::new("std/thread.ds".to_string()),
|
||||||
|
include_str!("../../std/thread.ds"),
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
stderr(),
|
||||||
|
)
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
thread = {
|
thread = {
|
||||||
sleep = (milliseconds: int) : none {
|
sleep = (milliseconds: int) : none {
|
||||||
__SLEEP__()
|
__SLEEP__(milliseconds)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user