Move AstFailure to error module
Signed-off-by: Marcel Müller <neikos@neikos.email>
This commit is contained in:
parent
4c8938e4ff
commit
058e6be516
3 changed files with 57 additions and 51 deletions
52
src/errors.rs
Normal file
52
src/errors.rs
Normal file
|
|
@ -0,0 +1,52 @@
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
|
use crate::parser::AstError;
|
||||||
|
|
||||||
|
#[derive(Debug, Error)]
|
||||||
|
pub struct AstFailure {
|
||||||
|
errors: Vec<AstError>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl std::fmt::Display for AstFailure {
|
||||||
|
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||||
|
f.write_str("TODO")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl AstFailure {
|
||||||
|
pub(crate) fn from_errors(errors: Vec<AstError>) -> AstFailure {
|
||||||
|
AstFailure { errors }
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn to_report(&self, source: &str) -> String {
|
||||||
|
let reports = self
|
||||||
|
.errors
|
||||||
|
.iter()
|
||||||
|
.map(|error| {
|
||||||
|
annotate_snippets::Level::ERROR
|
||||||
|
.primary_title(
|
||||||
|
error
|
||||||
|
.message
|
||||||
|
.as_deref()
|
||||||
|
.unwrap_or("An error occurred while producing an Ast"),
|
||||||
|
)
|
||||||
|
.element(
|
||||||
|
annotate_snippets::Snippet::source(source).annotation(
|
||||||
|
annotate_snippets::AnnotationKind::Primary
|
||||||
|
.span(error.span.clone().map(|s| s.range).unwrap_or_else(|| 0..0)),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
.elements(
|
||||||
|
error
|
||||||
|
.help
|
||||||
|
.as_ref()
|
||||||
|
.map(|help| annotate_snippets::Level::HELP.message(help)),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
.collect::<Vec<_>>();
|
||||||
|
|
||||||
|
let renderer = annotate_snippets::Renderer::styled()
|
||||||
|
.decor_style(annotate_snippets::renderer::DecorStyle::Unicode);
|
||||||
|
renderer.render(&reports)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -67,6 +67,9 @@ unstable_pub!(
|
||||||
mod parser
|
mod parser
|
||||||
);
|
);
|
||||||
|
|
||||||
|
/// Nomo Functions
|
||||||
|
pub mod errors;
|
||||||
|
|
||||||
/// Nomo Functions
|
/// Nomo Functions
|
||||||
pub mod functions;
|
pub mod functions;
|
||||||
/// Input for nomo
|
/// Input for nomo
|
||||||
|
|
@ -87,7 +90,7 @@ pub enum NomoError {
|
||||||
AstError {
|
AstError {
|
||||||
#[from]
|
#[from]
|
||||||
#[expect(missing_docs)]
|
#[expect(missing_docs)]
|
||||||
source: parser::AstFailure,
|
source: errors::AstFailure,
|
||||||
},
|
},
|
||||||
|
|
||||||
/// An error occurred while evaluating
|
/// An error occurred while evaluating
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,3 @@
|
||||||
use thiserror::Error;
|
|
||||||
use winnow::Parser;
|
use winnow::Parser;
|
||||||
use winnow::RecoverableParser;
|
use winnow::RecoverableParser;
|
||||||
use winnow::combinator::Infix::Left;
|
use winnow::combinator::Infix::Left;
|
||||||
|
|
@ -28,6 +27,7 @@ use winnow::stream::TokenSlice;
|
||||||
use winnow::token::any;
|
use winnow::token::any;
|
||||||
|
|
||||||
use crate::SourceSpan;
|
use crate::SourceSpan;
|
||||||
|
use crate::errors::AstFailure;
|
||||||
use crate::lexer::TemplateToken;
|
use crate::lexer::TemplateToken;
|
||||||
use crate::lexer::TokenKind;
|
use crate::lexer::TokenKind;
|
||||||
use crate::lexer::TokenOperator;
|
use crate::lexer::TokenOperator;
|
||||||
|
|
@ -151,55 +151,6 @@ impl ParserError<Input<'_>> for AstError {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Error)]
|
|
||||||
pub struct AstFailure {
|
|
||||||
errors: Vec<AstError>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl std::fmt::Display for AstFailure {
|
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
|
||||||
f.write_str("TODO")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl AstFailure {
|
|
||||||
fn from_errors(errors: Vec<AstError>) -> AstFailure {
|
|
||||||
AstFailure { errors }
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn to_report(&self, source: &str) -> String {
|
|
||||||
let reports = self
|
|
||||||
.errors
|
|
||||||
.iter()
|
|
||||||
.map(|error| {
|
|
||||||
annotate_snippets::Level::ERROR
|
|
||||||
.primary_title(
|
|
||||||
error
|
|
||||||
.message
|
|
||||||
.as_deref()
|
|
||||||
.unwrap_or("An error occurred while producing an Ast"),
|
|
||||||
)
|
|
||||||
.element(
|
|
||||||
annotate_snippets::Snippet::source(source).annotation(
|
|
||||||
annotate_snippets::AnnotationKind::Primary
|
|
||||||
.span(error.span.clone().map(|s| s.range).unwrap_or_else(|| 0..0)),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
.elements(
|
|
||||||
error
|
|
||||||
.help
|
|
||||||
.as_ref()
|
|
||||||
.map(|help| annotate_snippets::Level::HELP.message(help)),
|
|
||||||
)
|
|
||||||
})
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
|
|
||||||
let renderer = annotate_snippets::Renderer::styled()
|
|
||||||
.decor_style(annotate_snippets::renderer::DecorStyle::Unicode);
|
|
||||||
renderer.render(&reports)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
type Input<'input> = Recoverable<TokenSlice<'input, TemplateToken>, AstError>;
|
type Input<'input> = Recoverable<TokenSlice<'input, TemplateToken>, AstError>;
|
||||||
|
|
||||||
impl<'input> Parser<Input<'input>, TemplateToken, AstError> for TokenKind {
|
impl<'input> Parser<Input<'input>, TemplateToken, AstError> for TokenKind {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue