diff --git a/Cargo.toml b/Cargo.toml index dd6e5843..f8c2cb55 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,7 +14,7 @@ exclude = ["images/", "tests/", "miette-derive/"] [dependencies] thiserror = "1.0.40" -miette-derive = { path = "miette-derive", version = "=5.10.0" } +miette-derive = { path = "miette-derive", version = "=5.10.0", optional = true } once_cell = "1.8.0" unicode-width = "0.1.9" @@ -44,7 +44,8 @@ lazy_static = "1.4" serde_json = "1.0.64" [features] -default = [] +default = ["derive"] +derive = ["miette-derive"] no-format-args-capture = [] fancy-no-backtrace = [ "owo-colors", diff --git a/src/error.rs b/src/error.rs index 56041cab..4e57a788 100644 --- a/src/error.rs +++ b/src/error.rs @@ -1,27 +1,51 @@ -use std::io; +use std::{fmt, io}; use thiserror::Error; -use crate::{self as miette, Diagnostic}; +use crate::Diagnostic; /** Error enum for miette. Used by certain operations in the protocol. */ -#[derive(Debug, Diagnostic, Error)] +#[derive(Debug, Error)] pub enum MietteError { /// Wrapper around [`std::io::Error`]. This is returned when something went /// wrong while reading a [`SourceCode`](crate::SourceCode). #[error(transparent)] - #[diagnostic(code(miette::io_error), url(docsrs))] IoError(#[from] io::Error), /// Returned when a [`SourceSpan`](crate::SourceSpan) extends beyond the /// bounds of a given [`SourceCode`](crate::SourceCode). #[error("The given offset is outside the bounds of its Source")] - #[diagnostic( - code(miette::span_out_of_bounds), - help("Double-check your spans. Do you have an off-by-one error?"), - url(docsrs) - )] OutOfBounds, } + +impl Diagnostic for MietteError { + fn code<'a>(&'a self) -> Option> { + match self { + MietteError::IoError(_) => Some(Box::new("miette::io_error")), + MietteError::OutOfBounds => Some(Box::new("miette::span_out_of_bounds")), + } + } + + fn help<'a>(&'a self) -> Option> { + match self { + MietteError::IoError(_) => None, + MietteError::OutOfBounds => Some(Box::new( + "Double-check your spans. Do you have an off-by-one error?", + )), + } + } + + fn url<'a>(&'a self) -> Option> { + let crate_version = env!("CARGO_PKG_VERSION"); + let variant = match self { + MietteError::IoError(_) => "#variant.IoError", + MietteError::OutOfBounds => "#variant.OutOfBounds", + }; + Some(Box::new(format!( + "https://docs.rs/miette/{}/miette/enum.MietteError.html{}", + crate_version, variant, + ))) + } +} diff --git a/src/lib.rs b/src/lib.rs index 20589efa..3cb021b7 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -652,6 +652,7 @@ //! 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. +#[cfg(feature = "derive")] pub use miette_derive::*; pub use error::*;