NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #693 most downloaded on crates.io
Beautiful diagnostic reporting for text-based programming languages
Last release 11 months ago
22 Oct 2025
Ships unpredictably
gaps range from 2 weeks to 4.1 years
Some releases are documented
notes for 12 of 25 stable releases
Nothing withdrawn
no release was ever pulled
8 years old
25 releases · first in 2018
Release: codespan to 0.13.1, codespan-reporting to 0.13.1 and codespa…
Release: codespan to 0.13.1, codespan-reporting to 0.13.1 and codespa…
Version 0.13.1 fixes a few issues present in version 0.13.0.
&mut dyn WriteStyle #402str::from_utf8 not being available on rust 1.67 #405with_note #409Thanks to contributors and those who raised issues. Keep them coming!
One column per quarter.
Release: codespan 0.13.0
Release: codespan 0.13.0
Release 0.13.0 adds a new rendering decoration system for reporting. It also includes a bug fix.
In #387 @urisinger changed diagnostic emitting to be based on a new writer trait WriteStyle. This addition allows more flexibility in the output of emitting diagnostics. For example the default terminal ANSI style can be swapped out for SVG tag generation (see example). The change includes std::term::config::styles::StylesWriter and std::term::config::styles::Styles for customisation of colours and other decoration during emit.
This feature is backwards compatible with original termcolor writers.
The 0.12.0 version of codespan included ![no_std] support thanks to PR #374. Unfortunately, there were a few issues with it that were not caught by CI and went under the radar such as tests not passing under --no-default-features #399.
Another issue included complications with std::io::Write vs core::fmt::Write. This meant that String would work under --no-default-features but break with --feature std.
PR #400 adds checks for tests across feature configurations and adds different emit functions for different types of writers used. This includes a emit_to_string function that should work across feature configuration.
There still needs to be improvements in this area but I have not landed on anything simple.
WIP: It also adds a check to dependants of the library to check whether changes are compatible.
If you find any issues or have a feature suggestion, leave them in the issues.
Full Changelog: release/codespan-0.12.0...release/codespan-0.13.0
Update codespan-reporting to 0.12.0
Update codespan-reporting to 0.12.0
This release is version 0.12.0 of the codespan crate. A library the provides "Beautiful diagnostic reporting for text-based programming languages".
This release contains a few bug fixes and small changes, there are no new features of breaking changes.
I (@kaleidawave) have been graciously added as a maintainer to this repository and have been gifted permission to publish updates to codespan-reporting (and other crates in the repository) on crates.io by the original maintainer.
I hope that I can keep this project up to date and make sure that additions (such as seen below) can in the future be released under a shorter time frame.
If you have any feature requests or changes for this project/crate, then don't hesitate to ping me.
Auto-generated by GitHub
.with_message() method to take more generic message type by @oOBoomberOo in #217Files for term::emit. by @ennis in #354no_std Support by @bushrat011899 in #374Full Changelog: v0.11.1...release/codespan-0.12.0
Update codespan to 0.11.1
Update codespan to 0.11.1
Chars::{box_drawing, ascii} functions, the latter supporting a rustc-style of
output that only uses ASCII characters (not above U+007F) for use cases that do not allow
for box drawing characters, e.g. terminals that do not support them.Diagnostic::with_labels and Diagnostic::with_notes now append additional
labels rather tan overwriting them, meaning that the documentation and behaviour match
more closely. The behaviour will only differ if you call the same builder methods
multiple times. If you call every builder method once only, nothing should change.config::Chars::snippet_start is now a String instead of a single char.There is now a code of conduct and a contributing guide.
There is now a code of conduct and a contributing guide.
Some versions were skipped to sync up with the codespan-lsp crate. The release
process has been changed so this should not happen again.
PartialEq and Eq implementations for the diagnostic::{Diagnostic, Label, Severity} types.codespan_reporting::file::Error.
This type also replaces the custom error type for codespan-lsp.unwraps outside of tests and examples have been removed.Sections of source code that are marked with primary labels are now rendered using the primary highlight color.
Sections of source code that are marked with primary labels are now rendered using the primary highlight color.
Tab stops are now rendered properly.
We used to just render \t characters in source snippets with the same
number of spaces.
<details> <summary>Example</summary>
For example, when rendering with a tab width of 3 we
would print:
warning: tab test
┌─ tab_columns:1:2
│
1 │ hello
│ ^^^^^
2 │ ∙ hello
│ ^^^^^
3 │ ∙∙ hello
│ ^^^^^
4 │ ∙∙∙ hello
│ ^^^^^
5 │ ∙∙∙∙ hello
│ ^^^^^
6 │ ∙∙∙∙∙ hello
│ ^^^^^
7 │ ∙∙∙∙∙∙ hello
│ ^^^^^
Now we properly take into account the column of the tab character:
warning: tab test
┌─ tab_columns:1:2
│
1 │ hello
│ ^^^^^
2 │ ∙ hello
│ ^^^^^
3 │ ∙∙ hello
│ ^^^^^
4 │ ∙∙∙ hello
│ ^^^^^
5 │ ∙∙∙∙ hello
│ ^^^^^
6 │ ∙∙∙∙∙ hello
│ ^^^^^
7 │ ∙∙∙∙∙∙ hello
│ ^^^^^
</details>
We have made the caret rendering easier to read when there are multiple labels on the same line. We also avoid printing trailing borders on the final
We have made the caret rendering easier to read when there are multiple labels on the same line. We also avoid printing trailing borders on the final source source snippet if no notes are present.
<details> <summary>Example</summary>
Instead of this:
┌─ one_line.rs:3:5
│
3 │ v.push(v.pop().unwrap());
│ - first borrow later used by call
│ ---- first mutable borrow occurs here
│ ^ second mutable borrow occurs here
│
…we now render the following:
┌─ one_line.rs:3:5
│
3 │ v.push(v.pop().unwrap());
│ - ---- ^ second mutable borrow occurs here
│ │ │
│ │ first mutable borrow occurs here
│ first borrow later used by call
</details>
Some panics were fixed when invalid unicode boundaries are supplied.
Some panics were fixed when invalid unicode boundaries are supplied.
Labels that marked the same span were originally rendered in reverse order. This was a mistake! We've now fixed this.
<details> <summary>Example</summary>
For example, this diagnostic:
┌─ same_range:1:7
│
1 │ ::S { }
│ - Expected '('
│ ^ Unexpected '{'
│
…will now be rendered as:
┌─ same_range:1:7
│
1 │ ::S { }
│ ^ Unexpected '{'
│ - Expected '('
│
</details>
We've reduced the prominence of the 'locus' on source snippets by simplifying the border and reducing the spacing around it. This is to help focus attention on the underlined source snippet and error messages, rather than the location, which should be a secondary focus.
<details> <summary>Example</summary>
For example we originally rendered this:
error: unknown builtin: `NATRAL`
┌── Data/Nat.fun:7:13 ───
│
7 │ {-# BUILTIN NATRAL Nat #-}
│ ^^^^^^ unknown builtin
│
= there is a builtin with a similar name: `NATURAL`
…and now we render this:
error: unknown builtin: `NATRAL`
┌─ Data/Nat.fun:7:13
│
7 │ {-# BUILTIN NATRAL Nat #-}
│ ^^^^^^ unknown builtin
│
= there is a builtin with a similar name: `NATURAL`
</details>
Render overlapping multiline marks on the same lines of source code.
Render overlapping multiline marks on the same lines of source code.
<details> <summary>Example</summary>
For example:
error[E0308]: match arms have incompatible types
┌── codespan/src/file.rs:1:9 ───
│
1 │ ╭ match line_index.compare(self.last_line_index()) {
2 │ │ Ordering::Less => Ok(self.line_starts()[line_index.to_usize()]),
3 │ │ Ordering::Equal => Ok(self.source_span().end()),
4 │ │ Ordering::Greater => LineIndexOutOfBoundsError {
5 │ │ given: line_index,
6 │ │ max: self.last_line_index(),
7 │ │ },
8 │ │ }
│ ╰─────────' `match` arms have incompatible types
·
2 │ Ordering::Less => Ok(self.line_starts()[line_index.to_usize()]),
│ --------------------------------------------- this is found to be of type `Result<ByteIndex, LineIndexOutOfBoundsError>`
3 │ Ordering::Equal => Ok(self.source_span().end()),
│ ---------------------------- this is found to be of type `Result<ByteIndex, LineIndexOutOfBoundsError>`
4 │ Ordering::Greater => LineIndexOutOfBoundsError {
│ ╭──────────────────────────────────^
5 │ │ given: line_index,
6 │ │ max: self.last_line_index(),
7 │ │ },
│ ╰─────────────^ expected enum `Result`, found struct `LineIndexOutOfBoundsError`
│
= expected type `Result<ByteIndex, LineIndexOutOfBoundsError>`
found type `LineIndexOutOfBoundsError`
…is now rendered as:
error[E0308]: match arms have incompatible types
┌── codespan/src/file.rs:1:9 ───
│
1 │ ╭ match line_index.compare(self.last_line_index()) {
2 │ │ Ordering::Less => Ok(self.line_starts()[line_index.to_usize()]),
│ │ --------------------------------------------- this is found to be of type `Result<ByteIndex, LineIndexOutOfBoundsError>`
3 │ │ Ordering::Equal => Ok(self.source_span().end()),
│ │ ---------------------------- this is found to be of type `Result<ByteIndex, LineIndexOutOfBoundsError>`
4 │ │ Ordering::Greater => LineIndexOutOfBoundsError {
│ ╭─│──────────────────────────────────^
5 │ │ │ given: line_index,
6 │ │ │ max: self.last_line_index(),
7 │ │ │ },
│ ╰─│─────────────^ expected enum `Result`, found struct `LineIndexOutOfBoundsError`
8 │ │ }
│ ╰─────────' `match` arms have incompatible types
│
= expected type `Result<ByteIndex, LineIndexOutOfBoundsError>`
found type `LineIndexOutOfBoundsError`
</details>
codespan_reporting::Diagnostic now implements Debug.
codespan_reporting::diagnostic::Diagnostic now implements Debug.Single-line labels are now rendered together, under the same source line.
<details> <summary>Example</summary>
For example:
┌── one_line.rs:3:5 ───
│
3 │ v.push(v.pop().unwrap());
│ - first borrow later used by call
·
3 │ v.push(v.pop().unwrap());
│ ---- first mutable borrow occurs here
·
3 │ v.push(v.pop().unwrap());
│ ^ second mutable borrow occurs here
│
…is now rendered as:
┌── one_line.rs:3:5 ───
│
3 │ v.push(v.pop().unwrap());
│ - first borrow later used by call
│ ---- first mutable borrow occurs here
│ ^ second mutable borrow occurs here
│
</details>
The codespan_reporting::files module was added as a way to decouple codespan_reporting from codespan.
codespan_reporting::files module was added as a way to decouple
codespan_reporting from codespan.
codespan_reporting::files::Files allows users to implement custom file
databases that work with codespan_reporting. This should make it
easier to integrate with libraries like Salsa, and also makes it less
invasive to use codespan_reporting on existing projects.codespan_reporting::files::SimpleFile is a simple implementation of
codespan_reporting::files::Files where only a single file is needed.codespan_reporting::files::SimpleFiles is a simple implementation of
codespan_reporting::files::Files where multiple files are needed.codespan_reporting::diagnostic module has been greatly revamped,
making the builder API format more nicely with rustfmt, and allowing for
multiple primary labels.codespan_reporting::term::emit was improved,
with the following changes:
codespan_reporting::term::emit now takes writers as a trait object (rather
than using static dispatch) in order to reduce coda bloat and improve
compile times.codespan_reporting::term::Chars were tweaked for
consistency.codespan_reporting no longer depends on codespan.
Note that codespan can still be used with codespan_reporting,
as codespan::Files now implements codespan_reporting::files::Files.Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
[Unreleased]: https://github.com/brendanzab/codespan/compare/v0.11.1...HEAD [0.11.1]: https://github.com/brendanzab/codespan/compare/v0.11.0..v0.11.1
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Nothing published for this version
Your coding agent can read these notes before it upgrades. Set up the MCP server →