diff --git a/README.md b/README.md
index ab1c989..1792c9f 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,15 @@
-you run miette? You run her code like the software? Oh. Oh! Error code for
+
+# `miette`
+
+You run miette? You run her code like the software? Oh. Oh! Error code for
coder! Error code for One Thousand Lines!
-## About
+### About
`miette` is a diagnostic library for Rust. It includes a series of
traits/protocols that allow you to hook into its error reporting facilities,
-and even write your own error reports! It lets you define error types that can
-print out like this (or in any format you like!):
+and even write your own error reports! It lets you define error types that
+can print out like this (or in any format you like!):
> **NOTE: You must enable the `"fancy"` crate feature to get fancy report
-output like in the screenshots above.** You should only do this in your toplevel
-crate, as the fancy feature pulls in a number of dependencies that libraries
-and such might not want.
+output like in the screenshots above.** You should only do this in your
+toplevel crate, as the fancy feature pulls in a number of dependencies that
+libraries and such might not want.
-## Table of Contents
+### Table of Contents
- [About](#about)
- [Features](#features)
@@ -47,30 +50,32 @@ and such might not want.
- [Acknowledgements](#acknowledgements)
- [License](#license)
-## Features
+### Features
-- Generic [`Diagnostic`] protocol, compatible (and dependent on) `std::error::Error`.
+- Generic [`Diagnostic`] protocol, compatible (and dependent on)
+ [`std::error::Error`].
- Unique error codes on every [`Diagnostic`].
- Custom links to get more details on error codes.
- Super handy derive macro for defining diagnostic metadata.
- Replacements for [`anyhow`](https://docs.rs/anyhow)/[`eyre`](https://docs.rs/eyre)
- types [`Result`], [`Report`] and the [`miette!`] macro for the `anyhow!`/`eyre!`
- macros.
-- Generic support for arbitrary [`SourceCode`]s for snippet data, with default
- support for `String`s included.
+ types [`Result`], [`Report`] and the [`miette!`] macro for the
+ `anyhow!`/`eyre!` macros.
+- Generic support for arbitrary [`SourceCode`]s for snippet data, with
+ default support for `String`s included.
-The `miette` crate also comes bundled with a default [`ReportHandler`] with the following features:
+The `miette` crate also comes bundled with a default [`ReportHandler`] with
+the following features:
- Fancy graphical [diagnostic output](#about), using ANSI/Unicode text
- single- and multi-line highlighting support
- Screen reader/braille support, gated on [`NO_COLOR`](http://no-color.org/),
and other heuristics.
-- Fully customizable graphical theming (or overriding the printers entirely).
+- Fully customizable graphical theming (or overriding the printers
+ entirely).
- Cause chain printing
-- Turns diagnostic codes into links in [supported
- terminals](https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda).
+- Turns diagnostic codes into links in [supported terminals](https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda).
-## Installing
+### Installing
Using [`cargo-edit`](https://crates.io/crates/cargo-edit):
@@ -84,7 +89,7 @@ If you want to use the fancy printer in all these screenshots:
$ cargo add miette --features fancy
```
-## Example
+### Example
```rust
/*
@@ -100,7 +105,7 @@ use thiserror::Error;
#[diagnostic(
code(oops::my::bad),
url(docsrs),
- help("try doing it better next time?"),
+ help("try doing it better next time?")
)]
struct MyBad {
// The Source that we're gonna be printing snippets out of.
@@ -119,7 +124,7 @@ Use this `Result` type (or its expanded version) as the return type
throughout your app (but NOT your libraries! Those should always return
concrete types!).
*/
-use miette::{Result, NamedSource};
+use miette::{NamedSource, Result};
fn this_fails() -> Result<()> {
// You can use plain strings as a `Source`, or anything that implements
// the one-method `Source` trait.
@@ -166,9 +171,9 @@ diagnostic help: Change int or string to be the right types and try again.
diagnostic code: nu::parser::unsupported_operation
For more details, see https://docs.rs/nu-parser/0.1.0/nu-parser/enum.ParseError.html#variant.UnsupportedOperation">
-## Using
+### Using
-### ... in libraries
+#### ... in libraries
`miette` is _fully compatible_ with library usage. Consumers who don't know
about, or don't want, `miette` features can safely use its error types as
@@ -177,14 +182,14 @@ regular [`std::error::Error`].
We highly recommend using something like [`thiserror`](https://docs.rs/thiserror)
to define unique error types and error wrappers for your library.
-While `miette` integrates smoothly with `thiserror`, it is _not required_. If
-you don't want to use the [`Diagnostic`] derive macro, you can implement the
-trait directly, just like with `std::error::Error`.
+While `miette` integrates smoothly with `thiserror`, it is _not required_.
+If you don't want to use the [`Diagnostic`] derive macro, you can implement
+the trait directly, just like with `std::error::Error`.
```rust
// lib/error.rs
-use thiserror::Error;
use miette::Diagnostic;
+use thiserror::Error;
#[derive(Error, Diagnostic, Debug)]
pub enum MyLibError {
@@ -202,19 +207,19 @@ Then, return this error type from all your fallible public APIs. It's a best
practice to wrap any "external" error types in your error `enum` instead of
using something like [`Report`] in a library.
-### ... in application code
+#### ... in application code
-Application code tends to work a little differently than libraries. You don't
-always need or care to define dedicated error wrappers for errors coming from
-external libraries and tools.
+Application code tends to work a little differently than libraries. You
+don't always need or care to define dedicated error wrappers for errors
+coming from external libraries and tools.
For this situation, `miette` includes two tools: [`Report`] and
[`IntoDiagnostic`]. They work in tandem to make it easy to convert regular
`std::error::Error`s into [`Diagnostic`]s. Additionally, there's a
[`Result`] type alias that you can use to be more terse.
-When dealing with non-`Diagnostic` types, you'll want to `.into_diagnostic()`
-them:
+When dealing with non-`Diagnostic` types, you'll want to
+`.into_diagnostic()` them:
```rust
// my_app/lib/my_internal_file.rs
@@ -226,9 +231,10 @@ pub fn some_tool() -> Result {
}
```
-`miette` also includes an `anyhow`/`eyre`-style `Context`/`WrapErr` traits that
-you can import to add ad-hoc context messages to your `Diagnostic`s, as well,
-though you'll still need to use `.into_diagnostic()` to make use of it:
+`miette` also includes an `anyhow`/`eyre`-style `Context`/`WrapErr` traits
+that you can import to add ad-hoc context messages to your `Diagnostic`s, as
+well, though you'll still need to use `.into_diagnostic()` to make use of
+it:
```rust
// my_app/lib/my_internal_file.rs
@@ -236,23 +242,26 @@ use miette::{IntoDiagnostic, Result, WrapErr};
use semver::Version;
pub fn some_tool() -> Result {
- Ok("1.2.x".parse().into_diagnostic().wrap_err("Parsing this tool's semver version failed.")?)
+ Ok("1.2.x"
+ .parse()
+ .into_diagnostic()
+ .wrap_err("Parsing this tool's semver version failed.")?)
}
```
-### ... in `main()`
+#### ... in `main()`
`main()` is just like any other part of your application-internal code. Use
`Result` as your return value, and it will pretty-print your diagnostics
automatically.
> **NOTE:** You must enable the `"fancy"` crate feature to get fancy report
-output like in the screenshots here.** You should only do this in your toplevel
-crate, as the fancy feature pulls in a number of dependencies that libraries
-and such might not want.
+output like in the screenshots here.** You should only do this in your
+toplevel crate, as the fancy feature pulls in a number of dependencies that
+libraries and such might not want.
```rust
-use miette::{Result, IntoDiagnostic};
+use miette::{IntoDiagnostic, Result};
use semver::Version;
fn pretend_this_is_main() -> Result<()> {
@@ -270,23 +279,24 @@ enabled:
miette = { version = "X.Y.Z", features = ["fancy"] }
```
-### ... diagnostic code URLs
+#### ... diagnostic code URLs
-`miette` supports providing a URL for individual diagnostics. This URL will be
-displayed as an actual link in supported terminals, like so:
+`miette` supports providing a URL for individual diagnostics. This URL will
+be displayed as an actual link in supported terminals, like so:
-To use this, you can add a `url()` sub-param to your `#[diagnostic]` attribute:
+To use this, you can add a `url()` sub-param to your `#[diagnostic]`
+attribute:
```rust
use miette::Diagnostic;
@@ -303,10 +313,10 @@ struct MyErr;
```
Additionally, if you're developing a library and your error type is exported
-from your crate's top level, you can use a special `url(docsrs)` option instead
-of manually constructing the URL. This will automatically create a link to this
-diagnostic on `docs.rs`, so folks can just go straight to your (very high
-quality and detailed!) documentation on this diagnostic:
+from your crate's top level, you can use a special `url(docsrs)` option
+instead of manually constructing the URL. This will automatically create a
+link to this diagnostic on `docs.rs`, so folks can just go straight to your
+(very high quality and detailed!) documentation on this diagnostic:
```rust
use miette::Diagnostic;
@@ -322,21 +332,21 @@ use thiserror::Error;
struct MyErr;
```
-### ... snippets
+#### ... snippets
Along with its general error handling and reporting features, `miette` also
-includes facilities for adding error spans/annotations/labels to your output.
-This can be very useful when an error is syntax-related, but you can even use
-it to print out sections of your own source code!
+includes facilities for adding error spans/annotations/labels to your
+output. This can be very useful when an error is syntax-related, but you can
+even use it to print out sections of your own source code!
-To achieve this, `miette` defines its own lightweight [`SourceSpan`] type. This
-is a basic byte-offset and length into an associated [`SourceCode`] and, along
-with the latter, gives `miette` all the information it needs to pretty-print
-some snippets! You can also use your own `Into` types as label
-spans.
+To achieve this, `miette` defines its own lightweight [`SourceSpan`] type.
+This is a basic byte-offset and length into an associated [`SourceCode`]
+and, along with the latter, gives `miette` all the information it needs to
+pretty-print some snippets! You can also use your own `Into`
+types as label spans.
-The easiest way to define errors like this is to use the `derive(Diagnostic)`
-macro:
+The easiest way to define errors like this is to use the
+`derive(Diagnostic)` macro:
```rust
use miette::{Diagnostic, SourceSpan};
@@ -362,13 +372,13 @@ pub struct MyErrorType {
}
```
-### ... multiple related errors
+#### ... multiple related errors
`miette` supports collecting multiple errors into a single diagnostic, and
printing them all together nicely.
-To do so, use the `#[related]` tag on any `IntoIter` field in your `Diagnostic`
-type:
+To do so, use the `#[related]` tag on any `IntoIter` field in your
+`Diagnostic` type:
```rust
use miette::Diagnostic;
@@ -382,13 +392,13 @@ struct MyError {
}
```
-### ... delayed source code
+#### ... delayed source code
Sometimes it makes sense to add source code to the error message later. One
option is to use [`with_source_code()`](Report::with_source_code) method for
that:
-```rust,no_run
+```rust
use miette::{Diagnostic, SourceSpan};
use thiserror::Error;
@@ -403,7 +413,9 @@ pub struct MyErrorType {
fn do_something() -> miette::Result<()> {
// This function emits actual error with label
- return Err(MyErrorType { err_span: (7..11).into() })?;
+ return Err(MyErrorType {
+ err_span: (7..11).into(),
+ })?;
}
fn main() -> miette::Result<()> {
@@ -412,15 +424,14 @@ fn main() -> miette::Result<()> {
error.with_source_code(String::from("source code"))
})
}
-
```
-Also source code can be provided by a wrapper type. This is especially useful
-in combination with `related`, when multiple errors should be emitted at the
-same time:
+Also source code can be provided by a wrapper type. This is especially
+useful in combination with `related`, when multiple errors should be emitted
+at the same time:
-```rust,no_run
-use miette::{Report, Diagnostic, SourceSpan};
+```rust
+use miette::{Diagnostic, Report, SourceSpan};
use thiserror::Error;
#[derive(Diagnostic, Debug, Error)]
@@ -446,56 +457,59 @@ pub struct MultiError {
fn do_something() -> Result<(), Vec> {
Err(vec![
- InnerError { err_span: (0..6).into() },
- InnerError { err_span: (7..11).into() },
+ InnerError {
+ err_span: (0..6).into(),
+ },
+ InnerError {
+ err_span: (7..11).into(),
+ },
])
}
fn main() -> miette::Result<()> {
- do_something().map_err(|err_list| {
- MultiError {
- source_code: "source code".into(),
- related: err_list,
- }
+ do_something().map_err(|err_list| MultiError {
+ source_code: "source code".into(),
+ related: err_list,
})?;
Ok(())
}
```
-### ... handler options
+#### ... handler options
[`MietteHandler`] is the default handler, and is very customizable. In most
-cases, you can simply use [`MietteHandlerOpts`] to tweak its behavior instead
-of falling back to your own custom handler.
+cases, you can simply use [`MietteHandlerOpts`] to tweak its behavior
+instead of falling back to your own custom handler.
Usage is like so:
```rust
miette::set_hook(Box::new(|_| {
- Box::new(miette::MietteHandlerOpts::new()
- .terminal_links(true)
- .unicode(false)
- .context_lines(3)
- .tab_width(4)
- .build())
+ Box::new(
+ miette::MietteHandlerOpts::new()
+ .terminal_links(true)
+ .unicode(false)
+ .context_lines(3)
+ .tab_width(4)
+ .build(),
+ )
}))
-# .unwrap()
```
See the docs for [`MietteHandlerOpts`] for more details on what you can
customize!
-## Acknowledgements
+### Acknowledgements
-`miette` was not developed in a void. It owes enormous credit to various other
-projects and their authors:
+`miette` was not developed in a void. It owes enormous credit to various
+other projects and their authors:
-- [`anyhow`](http://crates.io/crates/anyhow) and
- [`color-eyre`](https://crates.io/crates/color-eyre): these two enormously
- influential error handling libraries have pushed forward the experience of
- application-level error handling and error reporting. `miette`'s `Report`
- type is an attempt at a very very rough version of their `Report` types.
+- [`anyhow`](http://crates.io/crates/anyhow) and [`color-eyre`](https://crates.io/crates/color-eyre):
+ these two enormously influential error handling libraries have pushed
+ forward the experience of application-level error handling and error
+ reporting. `miette`'s `Report` type is an attempt at a very very rough
+ version of their `Report` types.
- [`thiserror`](https://crates.io/crates/thiserror) for setting the standard
for library-level error definitions, and for being the inspiration behind
`miette`'s derive macro.
@@ -504,7 +518,7 @@ projects and their authors:
- [`ariadne`](https://crates.io/crates/ariadne) for pushing forward how
_pretty_ these diagnostics can really look!
-## License
+### License
`miette` is released to the Rust community under the
[Apache license 2.0](./LICENSE).
@@ -513,3 +527,15 @@ It also includes code taken from [`eyre`](https://github.com/yaahc/eyre),
and some from [`thiserror`](https://github.com/dtolnay/thiserror), also under
the Apache License. Some code is taken from
[`ariadne`](https://github.com/zesterer/ariadne), which is MIT licensed.
+
+[`miette!`]: https://docs.rs/miette/latest/miette/macro.miette.html
+[`std::error::Error`]: https://doc.rust-lang.org/nightly/std/error/trait.Error.html
+[`Diagnostic`]: https://docs.rs/miette/latest/miette/struct.Diagnostic.html
+[`IntoDiagnostic`]: https://docs.rs/miette/latest/miette/trait.IntoDiagnostic.html
+[`MietteHandlerOpts`]: https://docs.rs/miette/latest/miette/struct.MietteHandlerOpts.html
+[`MietteHandler`]: https://docs.rs/miette/latest/miette/struct.MietteHandler.html
+[`Report`]: https://docs.rs/miette/latest/miette/struct.Report.html
+[`ReportHandler`]: https://docs.rs/miette/latest/miette/struct.ReportHandler.html
+[`Result`]: https://docs.rs/miette/latest/miette/type.Result.html
+[`SourceCode`]: https://docs.rs/miette/latest/miette/struct.SourceCode.html
+[`SourceSpan`]: https://docs.rs/miette/latest/miette/struct.SourceSpan.html
diff --git a/README.tpl b/README.tpl
new file mode 100644
index 0000000..a791344
--- /dev/null
+++ b/README.tpl
@@ -0,0 +1,16 @@
+
+# `{{crate}}`
+
+{{readme}}
+
+[`miette!`]: https://docs.rs/miette/latest/miette/macro.miette.html
+[`std::error::Error`]: https://doc.rust-lang.org/nightly/std/error/trait.Error.html
+[`Diagnostic`]: https://docs.rs/miette/latest/miette/struct.Diagnostic.html
+[`IntoDiagnostic`]: https://docs.rs/miette/latest/miette/trait.IntoDiagnostic.html
+[`MietteHandlerOpts`]: https://docs.rs/miette/latest/miette/struct.MietteHandlerOpts.html
+[`MietteHandler`]: https://docs.rs/miette/latest/miette/struct.MietteHandler.html
+[`Report`]: https://docs.rs/miette/latest/miette/struct.Report.html
+[`ReportHandler`]: https://docs.rs/miette/latest/miette/struct.ReportHandler.html
+[`Result`]: https://docs.rs/miette/latest/miette/type.Result.html
+[`SourceCode`]: https://docs.rs/miette/latest/miette/struct.SourceCode.html
+[`SourceSpan`]: https://docs.rs/miette/latest/miette/struct.SourceSpan.html
diff --git a/rustfmt.toml b/rustfmt.toml
new file mode 100644
index 0000000..8f9ebdd
--- /dev/null
+++ b/rustfmt.toml
@@ -0,0 +1,3 @@
+edition = "2021"
+wrap_comments = true
+format_code_in_doc_comments = true
diff --git a/src/lib.rs b/src/lib.rs
index 97af775..bb1cc6c 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,7 +1,532 @@
-#![doc = include_str!("../README.md")]
#![deny(missing_docs, missing_debug_implementations, nonstandard_style)]
#![warn(unreachable_pub, rust_2018_idioms)]
-
+//! You run miette? You run her code like the software? Oh. Oh! Error code for
+//! coder! Error code for One Thousand Lines!
+//!
+//! ## About
+//!
+//! `miette` is a diagnostic library for Rust. It includes a series of
+//! traits/protocols that allow you to hook into its error reporting facilities,
+//! and even write your own error reports! It lets you define error types that
+//! can print out like this (or in any format you like!):
+//!
+//!
+//!
+//! > **NOTE: You must enable the `"fancy"` crate feature to get fancy report
+//! output like in the screenshots above.** You should only do this in your
+//! toplevel crate, as the fancy feature pulls in a number of dependencies that
+//! libraries and such might not want.
+//!
+//! ## Table of Contents
+//!
+//! - [About](#about)
+//! - [Features](#features)
+//! - [Installing](#installing)
+//! - [Example](#example)
+//! - [Using](#using)
+//! - [... in libraries](#-in-libraries)
+//! - [... in application code](#-in-application-code)
+//! - [... in `main()`](#-in-main)
+//! - [... diagnostic code URLs](#-diagnostic-code-urls)
+//! - [... snippets](#-snippets)
+//! - [... multiple related errors](#-multiple-related-errors)
+//! - [... delayed source code](#-delayed-source-code)
+//! - [... handler options](#-handler-options)
+//! - [Acknowledgements](#acknowledgements)
+//! - [License](#license)
+//!
+//! ## Features
+//!
+//! - Generic [`Diagnostic`] protocol, compatible (and dependent on)
+//! [`std::error::Error`].
+//! - Unique error codes on every [`Diagnostic`].
+//! - Custom links to get more details on error codes.
+//! - Super handy derive macro for defining diagnostic metadata.
+//! - Replacements for [`anyhow`](https://docs.rs/anyhow)/[`eyre`](https://docs.rs/eyre)
+//! types [`Result`], [`Report`] and the [`miette!`] macro for the
+//! `anyhow!`/`eyre!` macros.
+//! - Generic support for arbitrary [`SourceCode`]s for snippet data, with
+//! default support for `String`s included.
+//!
+//! The `miette` crate also comes bundled with a default [`ReportHandler`] with
+//! the following features:
+//!
+//! - Fancy graphical [diagnostic output](#about), using ANSI/Unicode text
+//! - single- and multi-line highlighting support
+//! - Screen reader/braille support, gated on [`NO_COLOR`](http://no-color.org/),
+//! and other heuristics.
+//! - Fully customizable graphical theming (or overriding the printers
+//! entirely).
+//! - Cause chain printing
+//! - Turns diagnostic codes into links in [supported terminals](https://gist.github.com/egmontkob/eb114294efbcd5adb1944c9f3cb5feda).
+//!
+//! ## Installing
+//!
+//! Using [`cargo-edit`](https://crates.io/crates/cargo-edit):
+//!
+//! ```sh
+//! $ cargo add miette
+//! ```
+//!
+//! If you want to use the fancy printer in all these screenshots:
+//!
+//! ```sh
+//! $ cargo add miette --features fancy
+//! ```
+//!
+//! ## Example
+//!
+//! ```rust
+//! /*
+//! You can derive a `Diagnostic` from any `std::error::Error` type.
+//!
+//! `thiserror` is a great way to define them, and plays nicely with `miette`!
+//! */
+//! use miette::{Diagnostic, SourceSpan};
+//! use thiserror::Error;
+//!
+//! #[derive(Error, Debug, Diagnostic)]
+//! #[error("oops!")]
+//! #[diagnostic(
+//! code(oops::my::bad),
+//! url(docsrs),
+//! help("try doing it better next time?")
+//! )]
+//! struct MyBad {
+//! // The Source that we're gonna be printing snippets out of.
+//! // This can be a String if you don't have or care about file names.
+//! #[source_code]
+//! src: NamedSource,
+//! // Snippets and highlights can be included in the diagnostic!
+//! #[label("This bit here")]
+//! bad_bit: SourceSpan,
+//! }
+//!
+//! /*
+//! Now let's define a function!
+//!
+//! Use this `Result` type (or its expanded version) as the return type
+//! throughout your app (but NOT your libraries! Those should always return
+//! concrete types!).
+//! */
+//! use miette::{NamedSource, Result};
+//! fn this_fails() -> Result<()> {
+//! // You can use plain strings as a `Source`, or anything that implements
+//! // the one-method `Source` trait.
+//! let src = "source\n text\n here".to_string();
+//! let len = src.len();
+//!
+//! Err(MyBad {
+//! src: NamedSource::new("bad_file.rs", src),
+//! bad_bit: (9, 4).into(),
+//! })?;
+//!
+//! Ok(())
+//! }
+//!
+//! /*
+//! Now to get everything printed nicely, just return a `Result<()>`
+//! and you're all set!
+//!
+//! Note: You can swap out the default reporter for a custom one using
+//! `miette::set_hook()`
+//! */
+//! fn pretend_this_is_main() -> Result<()> {
+//! // kaboom~
+//! this_fails()?;
+//!
+//! Ok(())
+//! }
+//! ```
+//!
+//! And this is the output you'll get if you run this program:
+//!
+//!
+//!
+//! ## Using
+//!
+//! ### ... in libraries
+//!
+//! `miette` is _fully compatible_ with library usage. Consumers who don't know
+//! about, or don't want, `miette` features can safely use its error types as
+//! regular [`std::error::Error`].
+//!
+//! We highly recommend using something like [`thiserror`](https://docs.rs/thiserror)
+//! to define unique error types and error wrappers for your library.
+//!
+//! While `miette` integrates smoothly with `thiserror`, it is _not required_.
+//! If you don't want to use the [`Diagnostic`] derive macro, you can implement
+//! the trait directly, just like with `std::error::Error`.
+//!
+//! ```rust
+//! // lib/error.rs
+//! use miette::Diagnostic;
+//! use thiserror::Error;
+//!
+//! #[derive(Error, Diagnostic, Debug)]
+//! pub enum MyLibError {
+//! #[error(transparent)]
+//! #[diagnostic(code(my_lib::io_error))]
+//! IoError(#[from] std::io::Error),
+//!
+//! #[error("Oops it blew up")]
+//! #[diagnostic(code(my_lib::bad_code))]
+//! BadThingHappened,
+//! }
+//! ```
+//!
+//! Then, return this error type from all your fallible public APIs. It's a best
+//! practice to wrap any "external" error types in your error `enum` instead of
+//! using something like [`Report`] in a library.
+//!
+//! ### ... in application code
+//!
+//! Application code tends to work a little differently than libraries. You
+//! don't always need or care to define dedicated error wrappers for errors
+//! coming from external libraries and tools.
+//!
+//! For this situation, `miette` includes two tools: [`Report`] and
+//! [`IntoDiagnostic`]. They work in tandem to make it easy to convert regular
+//! `std::error::Error`s into [`Diagnostic`]s. Additionally, there's a
+//! [`Result`] type alias that you can use to be more terse.
+//!
+//! When dealing with non-`Diagnostic` types, you'll want to
+//! `.into_diagnostic()` them:
+//!
+//! ```rust
+//! // my_app/lib/my_internal_file.rs
+//! use miette::{IntoDiagnostic, Result};
+//! use semver::Version;
+//!
+//! pub fn some_tool() -> Result {
+//! Ok("1.2.x".parse().into_diagnostic()?)
+//! }
+//! ```
+//!
+//! `miette` also includes an `anyhow`/`eyre`-style `Context`/`WrapErr` traits
+//! that you can import to add ad-hoc context messages to your `Diagnostic`s, as
+//! well, though you'll still need to use `.into_diagnostic()` to make use of
+//! it:
+//!
+//! ```rust
+//! // my_app/lib/my_internal_file.rs
+//! use miette::{IntoDiagnostic, Result, WrapErr};
+//! use semver::Version;
+//!
+//! pub fn some_tool() -> Result {
+//! Ok("1.2.x"
+//! .parse()
+//! .into_diagnostic()
+//! .wrap_err("Parsing this tool's semver version failed.")?)
+//! }
+//! ```
+//!
+//! ### ... in `main()`
+//!
+//! `main()` is just like any other part of your application-internal code. Use
+//! `Result` as your return value, and it will pretty-print your diagnostics
+//! automatically.
+//!
+//! > **NOTE:** You must enable the `"fancy"` crate feature to get fancy report
+//! output like in the screenshots here.** You should only do this in your
+//! toplevel crate, as the fancy feature pulls in a number of dependencies that
+//! libraries and such might not want.
+//!
+//! ```rust
+//! use miette::{IntoDiagnostic, Result};
+//! use semver::Version;
+//!
+//! fn pretend_this_is_main() -> Result<()> {
+//! let version: Version = "1.2.x".parse().into_diagnostic()?;
+//! println!("{}", version);
+//! Ok(())
+//! }
+//! ```
+//!
+//! Please note: in order to get fancy diagnostic rendering with all the pretty
+//! colors and arrows, you should install `miette` with the `fancy` feature
+//! enabled:
+//!
+//! ```toml
+//! miette = { version = "X.Y.Z", features = ["fancy"] }
+//! ```
+//!
+//! ### ... diagnostic code URLs
+//!
+//! `miette` supports providing a URL for individual diagnostics. This URL will
+//! be displayed as an actual link in supported terminals, like so:
+//!
+//!
+//!
+//! To use this, you can add a `url()` sub-param to your `#[diagnostic]`
+//! attribute:
+//!
+//! ```rust
+//! use miette::Diagnostic;
+//! use thiserror::Error;
+//!
+//! #[derive(Error, Diagnostic, Debug)]
+//! #[error("kaboom")]
+//! #[diagnostic(
+//! code(my_app::my_error),
+//! // You can do formatting!
+//! url("https://my_website.com/error_codes#{}", self.code().unwrap())
+//! )]
+//! struct MyErr;
+//! ```
+//!
+//! Additionally, if you're developing a library and your error type is exported
+//! from your crate's top level, you can use a special `url(docsrs)` option
+//! instead of manually constructing the URL. This will automatically create a
+//! link to this diagnostic on `docs.rs`, so folks can just go straight to your
+//! (very high quality and detailed!) documentation on this diagnostic:
+//!
+//! ```rust
+//! use miette::Diagnostic;
+//! use thiserror::Error;
+//!
+//! #[derive(Error, Diagnostic, Debug)]
+//! #[diagnostic(
+//! code(my_app::my_error),
+//! // Will link users to https://docs.rs/my_crate/0.0.0/my_crate/struct.MyErr.html
+//! url(docsrs)
+//! )]
+//! #[error("kaboom")]
+//! struct MyErr;
+//! ```
+//!
+//! ### ... snippets
+//!
+//! Along with its general error handling and reporting features, `miette` also
+//! includes facilities for adding error spans/annotations/labels to your
+//! output. This can be very useful when an error is syntax-related, but you can
+//! even use it to print out sections of your own source code!
+//!
+//! To achieve this, `miette` defines its own lightweight [`SourceSpan`] type.
+//! This is a basic byte-offset and length into an associated [`SourceCode`]
+//! and, along with the latter, gives `miette` all the information it needs to
+//! pretty-print some snippets! You can also use your own `Into`
+//! types as label spans.
+//!
+//! The easiest way to define errors like this is to use the
+//! `derive(Diagnostic)` macro:
+//!
+//! ```rust
+//! use miette::{Diagnostic, SourceSpan};
+//! use thiserror::Error;
+//!
+//! #[derive(Diagnostic, Debug, Error)]
+//! #[error("oops")]
+//! #[diagnostic(code(my_lib::random_error))]
+//! pub struct MyErrorType {
+//! // The `Source` that miette will use.
+//! #[source_code]
+//! src: String,
+//!
+//! // This will underline/mark the specific code inside the larger
+//! // snippet context.
+//! #[label = "This is the highlight"]
+//! err_span: SourceSpan,
+//!
+//! // You can add as many labels as you want.
+//! // They'll be rendered sequentially.
+//! #[label("This is bad")]
+//! snip2: (usize, usize), // `(usize, usize)` is `Into`!
+//! }
+//! ```
+//!
+//! ### ... multiple related errors
+//!
+//! `miette` supports collecting multiple errors into a single diagnostic, and
+//! printing them all together nicely.
+//!
+//! To do so, use the `#[related]` tag on any `IntoIter` field in your
+//! `Diagnostic` type:
+//!
+//! ```rust
+//! use miette::Diagnostic;
+//! use thiserror::Error;
+//!
+//! #[derive(Debug, Error, Diagnostic)]
+//! #[error("oops")]
+//! struct MyError {
+//! #[related]
+//! others: Vec,
+//! }
+//! ```
+//!
+//! ### ... delayed source code
+//!
+//! Sometimes it makes sense to add source code to the error message later. One
+//! option is to use [`with_source_code()`](Report::with_source_code) method for
+//! that:
+//!
+//! ```rust,no_run
+//! use miette::{Diagnostic, SourceSpan};
+//! use thiserror::Error;
+//!
+//! #[derive(Diagnostic, Debug, Error)]
+//! #[error("oops")]
+//! #[diagnostic()]
+//! pub struct MyErrorType {
+//! // Note: label but no source code
+//! #[label]
+//! err_span: SourceSpan,
+//! }
+//!
+//! fn do_something() -> miette::Result<()> {
+//! // This function emits actual error with label
+//! return Err(MyErrorType {
+//! err_span: (7..11).into(),
+//! })?;
+//! }
+//!
+//! fn main() -> miette::Result<()> {
+//! do_something().map_err(|error| {
+//! // And this code provides the source code for inner error
+//! error.with_source_code(String::from("source code"))
+//! })
+//! }
+//! ```
+//!
+//! Also source code can be provided by a wrapper type. This is especially
+//! useful in combination with `related`, when multiple errors should be emitted
+//! at the same time:
+//!
+//! ```rust,no_run
+//! use miette::{Diagnostic, Report, SourceSpan};
+//! use thiserror::Error;
+//!
+//! #[derive(Diagnostic, Debug, Error)]
+//! #[error("oops")]
+//! #[diagnostic()]
+//! pub struct InnerError {
+//! // Note: label but no source code
+//! #[label]
+//! err_span: SourceSpan,
+//! }
+//!
+//! #[derive(Diagnostic, Debug, Error)]
+//! #[error("oops: multiple errors")]
+//! #[diagnostic()]
+//! pub struct MultiError {
+//! // Note source code by no labels
+//! #[source_code]
+//! source_code: String,
+//! // The source code above is used for these errors
+//! #[related]
+//! related: Vec,
+//! }
+//!
+//! fn do_something() -> Result<(), Vec> {
+//! Err(vec![
+//! InnerError {
+//! err_span: (0..6).into(),
+//! },
+//! InnerError {
+//! err_span: (7..11).into(),
+//! },
+//! ])
+//! }
+//!
+//! fn main() -> miette::Result<()> {
+//! do_something().map_err(|err_list| MultiError {
+//! source_code: "source code".into(),
+//! related: err_list,
+//! })?;
+//! Ok(())
+//! }
+//! ```
+//!
+//! ### ... handler options
+//!
+//! [`MietteHandler`] is the default handler, and is very customizable. In most
+//! cases, you can simply use [`MietteHandlerOpts`] to tweak its behavior
+//! instead of falling back to your own custom handler.
+//!
+//! Usage is like so:
+//!
+//! ```rust
+//! miette::set_hook(Box::new(|_| {
+//! Box::new(
+//! miette::MietteHandlerOpts::new()
+//! .terminal_links(true)
+//! .unicode(false)
+//! .context_lines(3)
+//! .tab_width(4)
+//! .build(),
+//! )
+//! }))
+//!
+//! # .unwrap()
+//! ```
+//!
+//! See the docs for [`MietteHandlerOpts`] for more details on what you can
+//! customize!
+//!
+//! ## Acknowledgements
+//!
+//! `miette` was not developed in a void. It owes enormous credit to various
+//! other projects and their authors:
+//!
+//! - [`anyhow`](http://crates.io/crates/anyhow) and [`color-eyre`](https://crates.io/crates/color-eyre):
+//! these two enormously influential error handling libraries have pushed
+//! forward the experience of application-level error handling and error
+//! reporting. `miette`'s `Report` type is an attempt at a very very rough
+//! version of their `Report` types.
+//! - [`thiserror`](https://crates.io/crates/thiserror) for setting the standard
+//! for library-level error definitions, and for being the inspiration behind
+//! `miette`'s derive macro.
+//! - `rustc` and [@estebank](https://github.com/estebank) for their
+//! state-of-the-art work in compiler diagnostics.
+//! - [`ariadne`](https://crates.io/crates/ariadne) for pushing forward how
+//! _pretty_ these diagnostics can really look!
+//!
+//! ## License
+//!
+//! `miette` is released to the Rust community under the
+//! [Apache license 2.0](./LICENSE).
+//!
+//! It also includes code taken from [`eyre`](https://github.com/yaahc/eyre),
+//! and some from [`thiserror`](https://github.com/dtolnay/thiserror), also under
+//! the Apache License. Some code is taken from
+//! [`ariadne`](https://github.com/zesterer/ariadne), which is MIT licensed.
pub use miette_derive::*;
pub use error::*;