Skip to content

Commit

Permalink
Simplify OptionalWrapper
Browse files Browse the repository at this point in the history
- We never use `self`, so there is no need to pass it as a parameter...
- ... which then removes the need to instanciate the wrapper with `new`
- There is no reason to expect other type than `Option` so we can contrain
  the trait to the type directly instead of using the `IsOption` trait
  • Loading branch information
Nahor committed Feb 18, 2024
1 parent 75fea09 commit bb7c9a5
Show file tree
Hide file tree
Showing 3 changed files with 9 additions and 22 deletions.
4 changes: 2 additions & 2 deletions miette-derive/src/help.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ impl Help {
Some(quote! {
Self::#ident #display_pat => {
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)) })
},
})
}
Expand Down Expand Up @@ -137,7 +137,7 @@ impl Help {
#[allow(unused_variables, deprecated)]
let Self #display_pat = self;
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)) })
}
})
}
Expand Down
4 changes: 2 additions & 2 deletions miette-derive/src/label.rs
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,7 @@ impl Labels {
};

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

Some(quote! {
miette::macro_helpers::OptionalWrapper::<#ty>::new().to_option(#field)
miette::macro_helpers::OptionalWrapper::<#ty>::to_option(#field)
.map(|#var| #ctor(
#display,
#var.clone(),
Expand Down
23 changes: 5 additions & 18 deletions src/macro_helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,38 +3,25 @@ use crate::protocol::{LabeledSpan, SourceSpan};
// Huge thanks to @jam1gamer for this hack:
// https://twitter.com/jam1garner/status/1515887996444323840

#[doc(hidden)]
pub trait IsOption {}
impl<T> IsOption for Option<T> {}

#[doc(hidden)]
#[derive(Debug, Default)]
pub struct OptionalWrapper<T>(pub core::marker::PhantomData<T>);

impl<T> OptionalWrapper<T> {
pub fn new() -> Self {
Self(core::marker::PhantomData)
}
}

#[doc(hidden)]
pub trait ToOption {
#[doc(hidden)]
fn to_option<T>(self, value: T) -> Option<T>;
fn to_option<T>(value: T) -> Option<T>;
}

impl<T> OptionalWrapper<T>
where
T: IsOption,
{
impl<T> OptionalWrapper<Option<T>> {
#[doc(hidden)]
pub fn to_option(self, value: &T) -> &T {
pub fn to_option(value: &Option<T>) -> &Option<T> {
value
}
}

impl<T> ToOption for &OptionalWrapper<T> {
fn to_option<U>(self, value: U) -> Option<U> {
impl<T> ToOption for OptionalWrapper<T> {
fn to_option<U>(value: U) -> Option<U> {
Some(value)
}
}
Expand Down

0 comments on commit bb7c9a5

Please sign in to comment.