mirror of https://github.com/zkat/miette.git
Merge branch 'main' into fmt-width
This commit is contained in:
commit
2d303d8507
|
|
@ -33,11 +33,11 @@ jobs:
|
|||
strategy:
|
||||
matrix:
|
||||
features: [fancy, syntect-highlighter]
|
||||
rust: [1.70.0, stable]
|
||||
rust: [1.82.0, stable]
|
||||
os: [ubuntu-latest, macOS-latest, windows-latest]
|
||||
exclude:
|
||||
- features: syntect-highlighter
|
||||
rust: 1.70.0
|
||||
rust: 1.82.0
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
|
|
@ -52,7 +52,7 @@ jobs:
|
|||
if: matrix.rust == 'stable'
|
||||
run: cargo test --all --verbose --features ${{matrix.features}}
|
||||
- name: Run tests
|
||||
if: matrix.rust == '1.70.0'
|
||||
if: matrix.rust == '1.82.0'
|
||||
run: cargo test --all --verbose --features ${{matrix.features}} no-format-args-capture
|
||||
|
||||
wasm:
|
||||
|
|
|
|||
|
|
@ -9,12 +9,12 @@ documentation = "https://docs.rs/miette"
|
|||
license = "Apache-2.0"
|
||||
readme = "README.md"
|
||||
edition = "2018"
|
||||
rust-version = "1.70.0"
|
||||
rust-version = "1.82.0"
|
||||
exclude = ["images/", "tests/", "miette-derive/"]
|
||||
|
||||
[dependencies]
|
||||
miette-derive = { path = "miette-derive", version = "=7.6.0", optional = true }
|
||||
unicode-width = "0.1.11"
|
||||
unicode-width = "0.2.0"
|
||||
cfg-if = "1.0.0"
|
||||
|
||||
owo-colors = { version = "4.0.0", optional = true }
|
||||
|
|
@ -39,7 +39,6 @@ rustversion = "1.0"
|
|||
trybuild = { version = "1.0.89", features = ["diff"] }
|
||||
syn = { version = "2.0.87", features = ["full"] }
|
||||
regex = "1.10"
|
||||
lazy_static = "1.4"
|
||||
|
||||
serde = { version = "1.0.196", features = ["derive"] }
|
||||
serde_json = "1.0.113"
|
||||
|
|
|
|||
13
README.md
13
README.md
|
|
@ -211,6 +211,17 @@ pub enum MyLibError {
|
|||
// Use `#[diagnostic(transparent)]` to wrap another [`Diagnostic`]. You won't see labels otherwise
|
||||
#[diagnostic(transparent)]
|
||||
AnotherError(#[from] AnotherError),
|
||||
|
||||
/// Forward the diagnostic to a particular field.
|
||||
#[error("other error")]
|
||||
#[diagnostic(forward(the_actual_diagnostic))]
|
||||
EvenMoreData {
|
||||
unrelated_field_1: String,
|
||||
unrelated_field_2: usize,
|
||||
|
||||
#[source]
|
||||
the_actual_diagnostic: AnotherError,
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Error, Diagnostic, Debug)]
|
||||
|
|
@ -774,7 +785,7 @@ println!("{:?}", report.with_source_code("About something or another or yet anot
|
|||
|
||||
### MSRV
|
||||
|
||||
This crate requires rustc 1.70.0 or later.
|
||||
This crate requires rustc 1.82.0 or later.
|
||||
|
||||
### Acknowledgements
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
msrv = "1.70.0"
|
||||
msrv = "1.82.0"
|
||||
|
|
|
|||
|
|
@ -150,7 +150,7 @@ impl Forward {
|
|||
Self::#variant { #field_name, .. } => #field_name.#method_call,
|
||||
},
|
||||
Forward::Unnamed(index) => {
|
||||
let underscores: Vec<_> = core::iter::repeat(quote! { _, }).take(*index).collect();
|
||||
let underscores: Vec<_> = std::iter::repeat_n(quote! { _, }, *index).collect();
|
||||
let unnamed = format_ident!("unnamed");
|
||||
quote! {
|
||||
Self::#variant ( #(#underscores)* #unnamed, .. ) => #unnamed.#method_call,
|
||||
|
|
|
|||
|
|
@ -1,40 +1,6 @@
|
|||
use proc_macro2::TokenStream;
|
||||
use quote::{format_ident, quote, ToTokens};
|
||||
use syn::{
|
||||
parse::{Parse, ParseStream},
|
||||
spanned::Spanned,
|
||||
};
|
||||
|
||||
pub(crate) enum MemberOrString {
|
||||
Member(syn::Member),
|
||||
String(syn::LitStr),
|
||||
}
|
||||
|
||||
impl ToTokens for MemberOrString {
|
||||
fn to_tokens(&self, tokens: &mut TokenStream) {
|
||||
use MemberOrString::*;
|
||||
match self {
|
||||
Member(member) => member.to_tokens(tokens),
|
||||
String(string) => string.to_tokens(tokens),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Parse for MemberOrString {
|
||||
fn parse(input: ParseStream) -> syn::Result<Self> {
|
||||
let lookahead = input.lookahead1();
|
||||
if lookahead.peek(syn::Ident) || lookahead.peek(syn::LitInt) {
|
||||
Ok(MemberOrString::Member(input.parse()?))
|
||||
} else if lookahead.peek(syn::LitStr) {
|
||||
Ok(MemberOrString::String(input.parse()?))
|
||||
} else {
|
||||
Err(syn::Error::new(
|
||||
input.span(),
|
||||
"Expected a string or a field reference.",
|
||||
))
|
||||
}
|
||||
}
|
||||
}
|
||||
use quote::{format_ident, quote};
|
||||
use syn::spanned::Spanned;
|
||||
|
||||
use crate::{
|
||||
diagnostic::{DiagnosticConcreteArgs, DiagnosticDef},
|
||||
|
|
|
|||
|
|
@ -172,11 +172,7 @@ pub trait ReportHandler: core::any::Any + Send + Sync {
|
|||
/// }
|
||||
/// }
|
||||
/// ```
|
||||
fn debug(
|
||||
&self,
|
||||
error: &(dyn Diagnostic),
|
||||
f: &mut core::fmt::Formatter<'_>,
|
||||
) -> core::fmt::Result;
|
||||
fn debug(&self, error: &dyn Diagnostic, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result;
|
||||
|
||||
/// Override for the `Display` format
|
||||
fn display(
|
||||
|
|
|
|||
|
|
@ -402,7 +402,7 @@ impl Default for MietteHandler {
|
|||
}
|
||||
|
||||
impl ReportHandler for MietteHandler {
|
||||
fn debug(&self, diagnostic: &(dyn Diagnostic), f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
fn debug(&self, diagnostic: &dyn Diagnostic, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
if f.alternate() {
|
||||
return fmt::Debug::fmt(diagnostic, f);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -31,7 +31,7 @@ impl DebugReportHandler {
|
|||
pub fn render_report(
|
||||
&self,
|
||||
f: &mut fmt::Formatter<'_>,
|
||||
diagnostic: &(dyn Diagnostic),
|
||||
diagnostic: &dyn Diagnostic,
|
||||
) -> fmt::Result {
|
||||
let mut diag = f.debug_struct("Diagnostic");
|
||||
diag.field("message", &format!("{}", diagnostic));
|
||||
|
|
@ -61,7 +61,7 @@ impl DebugReportHandler {
|
|||
}
|
||||
|
||||
impl ReportHandler for DebugReportHandler {
|
||||
fn debug(&self, diagnostic: &(dyn Diagnostic), f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
fn debug(&self, diagnostic: &dyn Diagnostic, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
if f.alternate() {
|
||||
return fmt::Debug::fmt(diagnostic, f);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -250,7 +250,7 @@ impl GraphicalReportHandler {
|
|||
pub fn render_report(
|
||||
&self,
|
||||
f: &mut impl fmt::Write,
|
||||
diagnostic: &(dyn Diagnostic),
|
||||
diagnostic: &dyn Diagnostic,
|
||||
) -> fmt::Result {
|
||||
self.render_report_inner(f, diagnostic, diagnostic.source_code())
|
||||
}
|
||||
|
|
@ -258,7 +258,7 @@ impl GraphicalReportHandler {
|
|||
fn render_report_inner(
|
||||
&self,
|
||||
f: &mut impl fmt::Write,
|
||||
diagnostic: &(dyn Diagnostic),
|
||||
diagnostic: &dyn Diagnostic,
|
||||
parent_src: Option<&dyn SourceCode>,
|
||||
) -> fmt::Result {
|
||||
let src = diagnostic.source_code().or(parent_src);
|
||||
|
|
@ -289,7 +289,7 @@ impl GraphicalReportHandler {
|
|||
fn render_header(
|
||||
&self,
|
||||
f: &mut impl fmt::Write,
|
||||
diagnostic: &(dyn Diagnostic),
|
||||
diagnostic: &dyn Diagnostic,
|
||||
is_nested: bool,
|
||||
) -> fmt::Result {
|
||||
let severity_style = match diagnostic.severity() {
|
||||
|
|
@ -334,7 +334,7 @@ impl GraphicalReportHandler {
|
|||
fn render_causes(
|
||||
&self,
|
||||
f: &mut impl fmt::Write,
|
||||
diagnostic: &(dyn Diagnostic),
|
||||
diagnostic: &dyn Diagnostic,
|
||||
parent_src: Option<&dyn SourceCode>,
|
||||
) -> fmt::Result {
|
||||
let src = diagnostic.source_code().or(parent_src);
|
||||
|
|
@ -432,7 +432,7 @@ impl GraphicalReportHandler {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn render_footer(&self, f: &mut impl fmt::Write, diagnostic: &(dyn Diagnostic)) -> fmt::Result {
|
||||
fn render_footer(&self, f: &mut impl fmt::Write, diagnostic: &dyn Diagnostic) -> fmt::Result {
|
||||
if let Some(help) = diagnostic.help() {
|
||||
let width = self.termwidth.saturating_sub(2);
|
||||
let initial_indent = " help: ".style(self.theme.styles.help).to_string();
|
||||
|
|
@ -455,7 +455,7 @@ impl GraphicalReportHandler {
|
|||
fn render_related(
|
||||
&self,
|
||||
f: &mut impl fmt::Write,
|
||||
diagnostic: &(dyn Diagnostic),
|
||||
diagnostic: &dyn Diagnostic,
|
||||
parent_src: Option<&dyn SourceCode>,
|
||||
) -> fmt::Result {
|
||||
let src = diagnostic.source_code().or(parent_src);
|
||||
|
|
@ -543,7 +543,7 @@ impl GraphicalReportHandler {
|
|||
fn render_snippets(
|
||||
&self,
|
||||
f: &mut impl fmt::Write,
|
||||
diagnostic: &(dyn Diagnostic),
|
||||
diagnostic: &dyn Diagnostic,
|
||||
opt_source: Option<&dyn SourceCode>,
|
||||
) -> fmt::Result {
|
||||
let source = match opt_source {
|
||||
|
|
@ -1369,7 +1369,7 @@ impl GraphicalReportHandler {
|
|||
}
|
||||
|
||||
impl ReportHandler for GraphicalReportHandler {
|
||||
fn debug(&self, diagnostic: &(dyn Diagnostic), f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
fn debug(&self, diagnostic: &dyn Diagnostic, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
if f.alternate() {
|
||||
return fmt::Debug::fmt(diagnostic, f);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -60,7 +60,7 @@ impl JSONReportHandler {
|
|||
pub fn render_report(
|
||||
&self,
|
||||
f: &mut impl fmt::Write,
|
||||
diagnostic: &(dyn Diagnostic),
|
||||
diagnostic: &dyn Diagnostic,
|
||||
) -> fmt::Result {
|
||||
self._render_report(f, diagnostic, None)
|
||||
}
|
||||
|
|
@ -68,7 +68,7 @@ impl JSONReportHandler {
|
|||
fn _render_report(
|
||||
&self,
|
||||
f: &mut impl fmt::Write,
|
||||
diagnostic: &(dyn Diagnostic),
|
||||
diagnostic: &dyn Diagnostic,
|
||||
parent_src: Option<&dyn SourceCode>,
|
||||
) -> fmt::Result {
|
||||
write!(f, r#"{{"message": "{}","#, escape(&diagnostic.to_string()))?;
|
||||
|
|
@ -154,7 +154,7 @@ impl JSONReportHandler {
|
|||
fn render_snippets(
|
||||
&self,
|
||||
f: &mut impl fmt::Write,
|
||||
diagnostic: &(dyn Diagnostic),
|
||||
diagnostic: &dyn Diagnostic,
|
||||
source: &dyn SourceCode,
|
||||
) -> fmt::Result {
|
||||
if let Some(mut labels) = diagnostic.labels() {
|
||||
|
|
@ -170,7 +170,7 @@ impl JSONReportHandler {
|
|||
}
|
||||
|
||||
impl ReportHandler for JSONReportHandler {
|
||||
fn debug(&self, diagnostic: &(dyn Diagnostic), f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
fn debug(&self, diagnostic: &dyn Diagnostic, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
self.render_report(f, diagnostic)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ impl NarratableReportHandler {
|
|||
pub fn render_report(
|
||||
&self,
|
||||
f: &mut impl fmt::Write,
|
||||
diagnostic: &(dyn Diagnostic),
|
||||
diagnostic: &dyn Diagnostic,
|
||||
) -> fmt::Result {
|
||||
self.render_header(f, diagnostic)?;
|
||||
if self.with_cause_chain {
|
||||
|
|
@ -85,7 +85,7 @@ impl NarratableReportHandler {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn render_header(&self, f: &mut impl fmt::Write, diagnostic: &(dyn Diagnostic)) -> fmt::Result {
|
||||
fn render_header(&self, f: &mut impl fmt::Write, diagnostic: &dyn Diagnostic) -> fmt::Result {
|
||||
writeln!(f, "{}", diagnostic)?;
|
||||
let severity = match diagnostic.severity() {
|
||||
Some(Severity::Error) | None => "error",
|
||||
|
|
@ -96,7 +96,7 @@ impl NarratableReportHandler {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn render_causes(&self, f: &mut impl fmt::Write, diagnostic: &(dyn Diagnostic)) -> fmt::Result {
|
||||
fn render_causes(&self, f: &mut impl fmt::Write, diagnostic: &dyn Diagnostic) -> fmt::Result {
|
||||
if let Some(cause_iter) = diagnostic
|
||||
.diagnostic_source()
|
||||
.map(DiagnosticChain::from_diagnostic)
|
||||
|
|
@ -110,7 +110,7 @@ impl NarratableReportHandler {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
fn render_footer(&self, f: &mut impl fmt::Write, diagnostic: &(dyn Diagnostic)) -> fmt::Result {
|
||||
fn render_footer(&self, f: &mut impl fmt::Write, diagnostic: &dyn Diagnostic) -> fmt::Result {
|
||||
if let Some(help) = diagnostic.help() {
|
||||
writeln!(f, "diagnostic help: {}", help)?;
|
||||
}
|
||||
|
|
@ -126,7 +126,7 @@ impl NarratableReportHandler {
|
|||
fn render_related(
|
||||
&self,
|
||||
f: &mut impl fmt::Write,
|
||||
diagnostic: &(dyn Diagnostic),
|
||||
diagnostic: &dyn Diagnostic,
|
||||
parent_src: Option<&dyn SourceCode>,
|
||||
) -> fmt::Result {
|
||||
if let Some(related) = diagnostic.related() {
|
||||
|
|
@ -152,7 +152,7 @@ impl NarratableReportHandler {
|
|||
fn render_snippets(
|
||||
&self,
|
||||
f: &mut impl fmt::Write,
|
||||
diagnostic: &(dyn Diagnostic),
|
||||
diagnostic: &dyn Diagnostic,
|
||||
source_code: Option<&dyn SourceCode>,
|
||||
) -> fmt::Result {
|
||||
if let Some(source) = source_code {
|
||||
|
|
@ -344,7 +344,7 @@ impl NarratableReportHandler {
|
|||
}
|
||||
|
||||
impl ReportHandler for NarratableReportHandler {
|
||||
fn debug(&self, diagnostic: &(dyn Diagnostic), f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
fn debug(&self, diagnostic: &dyn Diagnostic, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
if f.alternate() {
|
||||
return fmt::Debug::fmt(diagnostic, f);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -125,7 +125,7 @@ impl HighlighterState for SyntectHighlighterState<'_> {
|
|||
line,
|
||||
&self.highlighter,
|
||||
)
|
||||
.map(|(style, str)| (convert_style(style, use_bg_color).style(str)))
|
||||
.map(|(style, str)| convert_style(style, use_bg_color).style(str))
|
||||
.collect()
|
||||
} else {
|
||||
vec![Style::default().style(line)]
|
||||
|
|
|
|||
13
src/lib.rs
13
src/lib.rs
|
|
@ -211,6 +211,17 @@
|
|||
//! // Use `#[diagnostic(transparent)]` to wrap another [`Diagnostic`]. You won't see labels otherwise
|
||||
//! #[diagnostic(transparent)]
|
||||
//! AnotherError(#[from] AnotherError),
|
||||
//!
|
||||
//! /// Forward the diagnostic to a particular field.
|
||||
//! #[error("other error")]
|
||||
//! #[diagnostic(forward(the_actual_diagnostic))]
|
||||
//! EvenMoreData {
|
||||
//! unrelated_field_1: String,
|
||||
//! unrelated_field_2: usize,
|
||||
//!
|
||||
//! #[source]
|
||||
//! the_actual_diagnostic: AnotherError,
|
||||
//! }
|
||||
//! }
|
||||
//!
|
||||
//! #[derive(Error, Diagnostic, Debug)]
|
||||
|
|
@ -775,7 +786,7 @@
|
|||
//!
|
||||
//! ## MSRV
|
||||
//!
|
||||
//! This crate requires rustc 1.70.0 or later.
|
||||
//! This crate requires rustc 1.82.0 or later.
|
||||
//!
|
||||
//! ## Acknowledgements
|
||||
//!
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
#![cfg(feature = "fancy-no-backtrace")]
|
||||
|
||||
use lazy_static::lazy_static;
|
||||
use miette::{Diagnostic, MietteHandler, MietteHandlerOpts, ReportHandler, RgbColors};
|
||||
use regex::Regex;
|
||||
use std::ffi::OsString;
|
||||
|
|
@ -69,9 +68,7 @@ impl Drop for EnvVarGuard<'_> {
|
|||
}
|
||||
}
|
||||
|
||||
lazy_static! {
|
||||
static ref COLOR_ENV_VARS: Mutex<()> = Mutex::new(());
|
||||
}
|
||||
static COLOR_ENV_VARS: Mutex<()> = Mutex::new(());
|
||||
|
||||
/// Assert the color format used by a handler with different levels of terminal
|
||||
/// support.
|
||||
|
|
|
|||
|
|
@ -376,6 +376,7 @@ enum NestedEnumError {
|
|||
},
|
||||
}
|
||||
|
||||
#[cfg(feature = "fancy-no-backtrace")]
|
||||
#[derive(Debug, miette::Diagnostic, thiserror::Error)]
|
||||
#[error("I am the inner error")]
|
||||
struct Case1Inner {
|
||||
|
|
|
|||
Loading…
Reference in New Issue