start doing error reporting

main
Ziyang Hu 2 years ago
parent ec27f75ab1
commit 658784b358

@ -38,6 +38,7 @@ rayon = "1.5.3"
nalgebra = "0.31.1"
approx = "0.5.1"
unicode-normalization = "0.1.21"
thiserror = "1.0.34"
cozorocks = { path = "cozorocks" }
#[target.'cfg(not(target_env = "msvc"))'.dependencies]

@ -257,7 +257,7 @@ impl Diagnostic for ffi::RocksDbStatus {
None
} else {
Some(Box::new(format!(
"cozorocks::{:?}::{:?}",
"rocksdb::{:?}::{:?}",
self.code, self.subcode
)))
}
@ -268,6 +268,9 @@ impl Diagnostic for ffi::RocksDbStatus {
_ => Some(Severity::Error),
}
}
fn help<'a>(&'a self) -> Option<Box<dyn Display + 'a>> {
Some(Box::new("This error is usually outside Cozo's control"))
}
}
impl ffi::RocksDbStatus {

@ -1,21 +1,22 @@
use std::collections::BTreeMap;
use miette::{IntoDiagnostic, Result};
use miette::{Diagnostic, Result};
use pest::error::InputLocation;
use pest::Parser;
use crate::data::program::InputProgram;
use crate::data::value::DataValue;
use crate::parse::query::parse_query;
use crate::parse::schema::{AttrTxItem, parse_schema};
use crate::parse::schema::{parse_schema, AttrTxItem};
use crate::parse::sys::{parse_sys, SysOp};
use crate::parse::tx::{parse_tx, Quintuple};
pub(crate) mod expr;
pub(crate) mod pull;
pub(crate) mod query;
pub(crate) mod tx;
pub(crate) mod schema;
pub(crate) mod sys;
pub(crate) mod tx;
#[derive(pest_derive::Parser)]
#[grammar = "cozoscript.pest"]
@ -28,7 +29,26 @@ pub(crate) enum CozoScript {
Query(InputProgram),
Tx(Vec<Quintuple>),
Schema(Vec<AttrTxItem>),
Sys(SysOp)
Sys(SysOp),
}
#[derive(thiserror::Error, Diagnostic, Debug)]
#[error("The query parser has encountered unexpected input / end of input")]
#[diagnostic(code(parse::pest))]
pub struct ParseError {
#[label("here")]
span: (usize, usize),
}
impl From<pest::error::Error<Rule>> for ParseError {
fn from(err: pest::error::Error<Rule>) -> Self {
match err.location {
InputLocation::Pos(p) => Self { span: (p, 0) },
InputLocation::Span((start, end)) => Self {
span: (start, end - start),
},
}
}
}
pub(crate) fn parse_script(
@ -36,7 +56,7 @@ pub(crate) fn parse_script(
param_pool: &BTreeMap<String, DataValue>,
) -> Result<CozoScript> {
let parsed = CozoScriptParser::parse(Rule::script, src)
.into_diagnostic()?
.map_err(|e| ParseError::from(e))?
.next()
.unwrap();
Ok(match parsed.as_rule() {

@ -280,7 +280,9 @@ impl Db {
.iter()
.map(|(k, v)| (k.clone(), DataValue::from(v)))
.collect();
match parse_script(payload, &param_pool)? {
match parse_script(payload, &param_pool)
.map_err(|e| e.with_source_code(payload.to_string()))?
{
CozoScript::Query(p) => self.run_query(p),
CozoScript::Tx(tx) => self.transact_triples(tx),
CozoScript::Schema(schema) => self.transact_attributes(schema),

Loading…
Cancel
Save