miette/
macro_helpers.rs

1use crate::protocol::{LabeledSpan, SourceSpan};
2
3// Huge thanks to @jam1gamer for this hack:
4// https://twitter.com/jam1garner/status/1515887996444323840
5
6#[doc(hidden)]
7pub trait IsOption {}
8impl<T> IsOption for Option<T> {}
9
10#[doc(hidden)]
11#[derive(Debug, Default)]
12pub struct OptionalWrapper<T>(pub core::marker::PhantomData<T>);
13
14impl<T> OptionalWrapper<T> {
15    pub fn new() -> Self {
16        Self(core::marker::PhantomData)
17    }
18}
19
20#[doc(hidden)]
21pub trait ToOption {
22    #[doc(hidden)]
23    fn to_option<T>(self, value: T) -> Option<T>;
24}
25
26impl<T> OptionalWrapper<T>
27where
28    T: IsOption,
29{
30    #[doc(hidden)]
31    pub fn to_option(self, value: &T) -> &T {
32        value
33    }
34}
35
36impl<T> ToOption for &OptionalWrapper<T> {
37    fn to_option<U>(self, value: U) -> Option<U> {
38        Some(value)
39    }
40}
41
42#[doc(hidden)]
43#[derive(Debug)]
44pub struct ToLabelSpanWrapper {}
45pub trait ToLabeledSpan<T> {
46    #[doc(hidden)]
47    fn to_labeled_span(span: T) -> LabeledSpan;
48}
49impl ToLabeledSpan<LabeledSpan> for ToLabelSpanWrapper {
50    fn to_labeled_span(span: LabeledSpan) -> LabeledSpan {
51        span
52    }
53}
54impl<T> ToLabeledSpan<T> for ToLabelSpanWrapper
55where
56    T: Into<SourceSpan>,
57{
58    fn to_labeled_span(span: T) -> LabeledSpan {
59        LabeledSpan::new_with_span(None, span.into())
60    }
61}