From 058e6be516091f6432973fb553d3067764290aaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcel=20M=C3=BCller?= Date: Mon, 16 Mar 2026 09:44:38 +0100 Subject: [PATCH] Move AstFailure to error module MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Marcel Müller --- src/errors.rs | 52 +++++++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 5 ++++- src/parser/mod.rs | 51 +--------------------------------------------- 3 files changed, 57 insertions(+), 51 deletions(-) create mode 100644 src/errors.rs diff --git a/src/errors.rs b/src/errors.rs new file mode 100644 index 0000000..5ca0c36 --- /dev/null +++ b/src/errors.rs @@ -0,0 +1,52 @@ +use thiserror::Error; + +use crate::parser::AstError; + +#[derive(Debug, Error)] +pub struct AstFailure { + errors: Vec, +} + +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) -> 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::>(); + + let renderer = annotate_snippets::Renderer::styled() + .decor_style(annotate_snippets::renderer::DecorStyle::Unicode); + renderer.render(&reports) + } +} diff --git a/src/lib.rs b/src/lib.rs index 9311ac0..685fbb8 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -67,6 +67,9 @@ unstable_pub!( mod parser ); +/// Nomo Functions +pub mod errors; + /// Nomo Functions pub mod functions; /// Input for nomo @@ -87,7 +90,7 @@ pub enum NomoError { AstError { #[from] #[expect(missing_docs)] - source: parser::AstFailure, + source: errors::AstFailure, }, /// An error occurred while evaluating diff --git a/src/parser/mod.rs b/src/parser/mod.rs index a357725..73cc0b2 100644 --- a/src/parser/mod.rs +++ b/src/parser/mod.rs @@ -1,4 +1,3 @@ -use thiserror::Error; use winnow::Parser; use winnow::RecoverableParser; use winnow::combinator::Infix::Left; @@ -28,6 +27,7 @@ use winnow::stream::TokenSlice; use winnow::token::any; use crate::SourceSpan; +use crate::errors::AstFailure; use crate::lexer::TemplateToken; use crate::lexer::TokenKind; use crate::lexer::TokenOperator; @@ -151,55 +151,6 @@ impl ParserError> for AstError { } } -#[derive(Debug, Error)] -pub struct AstFailure { - errors: Vec, -} - -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) -> 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::>(); - - let renderer = annotate_snippets::Renderer::styled() - .decor_style(annotate_snippets::renderer::DecorStyle::Unicode); - renderer.render(&reports) - } -} - type Input<'input> = Recoverable, AstError>; impl<'input> Parser, TemplateToken, AstError> for TokenKind {