Skip to content

feat: return printable compilation diagnostics#53

Open
lukas-loering wants to merge 1 commit into
Relacibo:mainfrom
lukas-loering:main
Open

feat: return printable compilation diagnostics#53
lukas-loering wants to merge 1 commit into
Relacibo:mainfrom
lukas-loering:main

Conversation

@lukas-loering
Copy link
Copy Markdown

The previous implementation forwarded the display of source diagnostics to the debug implementation of Typst's SourceDiagnostic. While this prints the diagnostic message, other information like the diagnostics location in the source file, or the backtrace were not shown in a human- readble way.
Crucially, this information could also not be obtained, as the World used for the compilation went out of scope as the compile function returned.

This commit solves this issue by converting SourceDiagnostics to a new Diagnostic type, which resolves World dependent information, while keeping all other data of the SourceDiagnostic. Furthermore, a Diagnostic will display the information in a human-readable way.

Closes #19

The previous implementation forwarded the display of source diagnostics
to the debug implementation of Typst's `SourceDiagnostic`. While this
prints the diagnostic message, other information like the diagnostics
location in the source file, or the backtrace were not shown in a human-
readble way.
Crucially, this information could also **not** be obtained, as the
`World` used for the compilation went out of scope as the compile
function returned.

This commit solves this issue by converting SourceDiagnostics to a new
`Diagnostic` type, which resolves World dependent information, while
keeping all other data of the SourceDiagnostic. Furthermore, a
`Diagnostic` will display the information in a human-readable way.
@lukas-loering
Copy link
Copy Markdown
Author

@Relacibo Hey, just pinging you in case you did not see this PR :)

@Relacibo
Copy link
Copy Markdown
Owner

Relacibo commented Jun 3, 2026

ok thank you for the pr. I'll take a look at it.

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR improves how Typst compilation diagnostics are surfaced by resolving SourceDiagnostic information while the compilation World is still available, and by introducing a new pretty-printable diagnostic representation.

Changes:

  • Add a new diagnostic module that converts SourceDiagnostic into a Diagnostic/Diagnostics type that can be displayed without a World.
  • Update compilation error handling to map Typst compilation errors into TypstAsLibError::TypstSource(Diagnostics) using the in-scope world.
  • Change TypstAsLibError::TypstSource payload type from EcoVec<SourceDiagnostic> to Diagnostics to enable human-readable formatting.

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated 5 comments.

File Description
src/lib.rs Converts compilation error diagnostics into a new printable Diagnostics type and updates the public error enum accordingly.
src/diagnostic.rs Introduces Diagnostic/Diagnostics and ResolvedSpan to pretty-print diagnostics without needing the compilation World.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/diagnostic.rs
@@ -0,0 +1,182 @@
//! Convert world dependent [`SourceDiagnositcs`] into independently displayable Diagnostics.
Comment thread src/diagnostic.rs
Comment on lines +37 to +39
/// This is basically a [`SourceDiagnostic`] where [`Spans`] have been converted to [`ResolvedSpans`],
/// so that diagnostic information can be obtained without access to the [`typst::World`] used for compilation.
///
Comment thread src/diagnostic.rs
Comment on lines +151 to +154
impl Display for ResolvedSpan {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{:?}:{}", self.source.id().vpath(), self.location())
}
Comment thread src/lib.rs
Comment on lines 148 to 151
Warned {
output: output.map_err(Into::into),
output: output.map_err(|diags| TypstAsLibError::from_diagnostics(&world, diags)),
warnings,
}
Comment thread src/lib.rs
Comment on lines 748 to 753
#[derive(Debug, Clone, Error)]
pub enum TypstAsLibError {
/// Errors from Typst source compilation.
#[error("Typst source error: {0:?}")]
TypstSource(EcoVec<SourceDiagnostic>),
#[error("{0}")]
TypstSource(Diagnostics),
/// Errors from file operations.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Error Formatting

3 participants