This commit is contained in:
Nahor 2026-06-01 12:08:33 -07:00 committed by GitHub
commit dcb978d4a4
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 9 additions and 22 deletions

View File

@ -108,7 +108,7 @@ impl Help {
Some(quote! { Some(quote! {
Self::#ident #display_pat => { Self::#ident #display_pat => {
use miette::macro_helpers::ToOption; use miette::macro_helpers::ToOption;
miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(&#help).as_ref().map(|#var| -> std::boxed::Box<dyn std::fmt::Display + '_> { std::boxed::Box::new(format!("{}", #var)) }) miette::macro_helpers::OptionalWrapper::<#ty>::to_option(&#help).as_ref().map(|#var| -> std::boxed::Box<dyn std::fmt::Display + '_> { std::boxed::Box::new(format!("{}", #var)) })
}, },
}) })
} }
@ -137,7 +137,7 @@ impl Help {
#[allow(unused_variables, deprecated)] #[allow(unused_variables, deprecated)]
let Self #display_pat = self; let Self #display_pat = self;
use miette::macro_helpers::ToOption; use miette::macro_helpers::ToOption;
miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(&self.#member).as_ref().map(|#var| -> std::boxed::Box<dyn std::fmt::Display + '_> { std::boxed::Box::new(format!("{}", #var)) }) miette::macro_helpers::OptionalWrapper::<#ty>::to_option(&self.#member).as_ref().map(|#var| -> std::boxed::Box<dyn std::fmt::Display + '_> { std::boxed::Box::new(format!("{}", #var)) })
} }
}) })
} }

View File

@ -186,7 +186,7 @@ impl Labels {
}; };
Some(quote! { Some(quote! {
miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(&self.#span) miette::macro_helpers::OptionalWrapper::<#ty>::to_option(&self.#span)
.map(|#var| #ctor( .map(|#var| #ctor(
#display, #display,
#var.clone(), #var.clone(),
@ -273,7 +273,7 @@ impl Labels {
}; };
Some(quote! { Some(quote! {
miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(#field) miette::macro_helpers::OptionalWrapper::<#ty>::to_option(#field)
.map(|#var| #ctor( .map(|#var| #ctor(
#display, #display,
#var.clone(), #var.clone(),

View File

@ -3,38 +3,25 @@ use crate::protocol::{LabeledSpan, SourceSpan};
// Huge thanks to @jam1gamer for this hack: // Huge thanks to @jam1gamer for this hack:
// https://twitter.com/jam1garner/status/1515887996444323840 // https://twitter.com/jam1garner/status/1515887996444323840
#[doc(hidden)]
pub trait IsOption {}
impl<T> IsOption for Option<T> {}
#[doc(hidden)] #[doc(hidden)]
#[derive(Debug, Default)] #[derive(Debug, Default)]
pub struct OptionalWrapper<T>(pub core::marker::PhantomData<T>); pub struct OptionalWrapper<T>(pub core::marker::PhantomData<T>);
impl<T> OptionalWrapper<T> {
pub fn new() -> Self {
Self(core::marker::PhantomData)
}
}
#[doc(hidden)] #[doc(hidden)]
pub trait ToOption { pub trait ToOption {
#[doc(hidden)] #[doc(hidden)]
fn to_option<T>(self, value: T) -> Option<T>; fn to_option<T>(value: T) -> Option<T>;
} }
impl<T> OptionalWrapper<T> impl<T> OptionalWrapper<Option<T>> {
where
T: IsOption,
{
#[doc(hidden)] #[doc(hidden)]
pub fn to_option(self, value: &T) -> &T { pub fn to_option(value: &Option<T>) -> &Option<T> {
value value
} }
} }
impl<T> ToOption for &OptionalWrapper<T> { impl<T> ToOption for OptionalWrapper<T> {
fn to_option<U>(self, value: U) -> Option<U> { fn to_option<U>(value: U) -> Option<U> {
Some(value) Some(value)
} }
} }