2019-10-24 12:01:27 -07:00
|
|
|
use super::test_highlight;
|
2019-05-30 16:52:30 -07:00
|
|
|
use std::fmt::Write;
|
2019-01-07 17:57:27 -08:00
|
|
|
use std::io;
|
2020-09-24 13:47:27 -07:00
|
|
|
use tree_sitter::{QueryError, QueryErrorKind};
|
2021-02-25 10:24:54 -05:00
|
|
|
use walkdir;
|
2019-01-07 17:57:27 -08:00
|
|
|
|
2018-12-05 12:50:12 -08:00
|
|
|
#[derive(Debug)]
|
2019-05-30 16:52:30 -07:00
|
|
|
pub struct Error(pub Vec<String>);
|
2018-12-05 12:50:12 -08:00
|
|
|
|
|
|
|
|
pub type Result<T> = std::result::Result<T, Error>;
|
|
|
|
|
|
2018-12-08 13:44:11 -08:00
|
|
|
impl Error {
|
|
|
|
|
pub fn grammar(message: &str) -> Self {
|
2019-05-30 16:52:30 -07:00
|
|
|
Error(vec![format!("Grammar error: {}", message)])
|
2018-12-08 13:44:11 -08:00
|
|
|
}
|
|
|
|
|
|
2021-01-29 16:37:45 -08:00
|
|
|
pub fn regex(mut message: String) -> Self {
|
|
|
|
|
message.insert_str(0, "Regex error: ");
|
|
|
|
|
Error(vec![message])
|
2019-01-04 12:42:45 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn undefined_symbol(name: &str) -> Self {
|
2019-05-30 16:52:30 -07:00
|
|
|
Error(vec![format!("Undefined symbol `{}`", name)])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn new(message: String) -> Self {
|
|
|
|
|
Error(vec![message])
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn err<T>(message: String) -> Result<T> {
|
|
|
|
|
Err(Error::new(message))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn wrap<E: Into<Self>, M: ToString, F: FnOnce() -> M>(
|
|
|
|
|
message_fn: F,
|
|
|
|
|
) -> impl FnOnce(E) -> Self {
|
|
|
|
|
|e| {
|
|
|
|
|
let mut result = e.into();
|
|
|
|
|
result.0.push(message_fn().to_string());
|
|
|
|
|
result
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub fn message(&self) -> String {
|
|
|
|
|
let mut result = self.0.last().unwrap().clone();
|
|
|
|
|
if self.0.len() > 1 {
|
|
|
|
|
result.push_str("\nDetails:\n");
|
|
|
|
|
for msg in self.0[0..self.0.len() - 1].iter().rev() {
|
|
|
|
|
writeln!(&mut result, " {}", msg).unwrap();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
result
|
2018-12-08 13:44:11 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-09-24 13:47:27 -07:00
|
|
|
impl<'a> From<(&str, QueryError)> for Error {
|
|
|
|
|
fn from((path, error): (&str, QueryError)) -> Self {
|
|
|
|
|
let mut msg = format!("Query error at {}:{}. ", path, error.row + 1);
|
|
|
|
|
match error.kind {
|
|
|
|
|
QueryErrorKind::Capture => write!(&mut msg, "Invalid capture name {}", error.message),
|
|
|
|
|
QueryErrorKind::Field => write!(&mut msg, "Invalid field name {}", error.message),
|
|
|
|
|
QueryErrorKind::NodeType => write!(&mut msg, "Invalid node type {}", error.message),
|
|
|
|
|
QueryErrorKind::Syntax => write!(&mut msg, "Invalid syntax:\n{}", error.message),
|
|
|
|
|
QueryErrorKind::Structure => write!(&mut msg, "Impossible pattern:\n{}", error.message),
|
|
|
|
|
QueryErrorKind::Predicate => write!(&mut msg, "Invalid predicate: {}", error.message),
|
2019-10-18 14:42:52 -07:00
|
|
|
}
|
2020-09-24 13:47:27 -07:00
|
|
|
.unwrap();
|
|
|
|
|
Self::new(msg)
|
2019-09-18 17:35:47 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl<'a> From<tree_sitter_highlight::Error> for Error {
|
|
|
|
|
fn from(error: tree_sitter_highlight::Error) -> Self {
|
|
|
|
|
Error::new(format!("{:?}", error))
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-03-10 10:43:23 -07:00
|
|
|
impl<'a> From<tree_sitter_tags::Error> for Error {
|
|
|
|
|
fn from(error: tree_sitter_tags::Error) -> Self {
|
2020-06-18 14:43:27 -07:00
|
|
|
Error::new(format!("{}", error))
|
2020-03-10 10:43:23 -07:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2018-12-05 12:50:12 -08:00
|
|
|
impl From<serde_json::Error> for Error {
|
|
|
|
|
fn from(error: serde_json::Error) -> Self {
|
2019-05-30 16:52:30 -07:00
|
|
|
Error::new(error.to_string())
|
2018-12-05 12:50:12 -08:00
|
|
|
}
|
|
|
|
|
}
|
2019-01-07 17:57:27 -08:00
|
|
|
|
|
|
|
|
impl From<io::Error> for Error {
|
|
|
|
|
fn from(error: io::Error) -> Self {
|
2019-05-30 16:52:30 -07:00
|
|
|
Error::new(error.to_string())
|
2019-01-07 17:57:27 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-12-06 11:41:21 -08:00
|
|
|
impl From<glob::PatternError> for Error {
|
|
|
|
|
fn from(error: glob::PatternError) -> Self {
|
|
|
|
|
Error::new(error.to_string())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl From<glob::GlobError> for Error {
|
|
|
|
|
fn from(error: glob::GlobError) -> Self {
|
|
|
|
|
Error::new(error.to_string())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-05-30 16:52:30 -07:00
|
|
|
impl From<regex_syntax::ast::Error> for Error {
|
|
|
|
|
fn from(error: regex_syntax::ast::Error) -> Self {
|
|
|
|
|
Error::new(error.to_string())
|
2019-01-09 18:09:55 -08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-10-24 12:01:27 -07:00
|
|
|
impl From<test_highlight::Failure> for Error {
|
|
|
|
|
fn from(error: test_highlight::Failure) -> Self {
|
|
|
|
|
Error::new(error.message())
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2019-01-07 17:57:27 -08:00
|
|
|
impl From<String> for Error {
|
|
|
|
|
fn from(error: String) -> Self {
|
2019-05-30 16:52:30 -07:00
|
|
|
Error::new(error)
|
2019-01-07 17:57:27 -08:00
|
|
|
}
|
|
|
|
|
}
|
2021-02-25 10:24:54 -05:00
|
|
|
|
|
|
|
|
impl From<walkdir::Error> for Error {
|
|
|
|
|
fn from(error: walkdir::Error) -> Self {
|
|
|
|
|
Error::new(error.to_string())
|
|
|
|
|
}
|
|
|
|
|
}
|