1use crate::protocol::{LabeledSpan, SourceSpan};
2
3#[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}