1use core::fmt::Display;
2
3pub struct SourceOutput<'a, S: SourceRepr> {
4 object: &'a S,
5}
6
7pub trait SourceRepr {
8 fn to_source(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result;
9}
10
11impl<S: SourceRepr> Display for SourceOutput<'_, S> {
12 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
13 self.object.to_source(f)
14 }
15}
16
17impl<'a, S: SourceRepr> SourceOutput<'a, S> {
18 pub fn new(object: &'a S) -> Self {
19 SourceOutput { object }
20 }
21}
22
23macro_rules! source_repr_prim {
24 ($t:ty) => {
25 impl SourceRepr for $t {
26 fn to_source(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
27 write!(f, "{:?}", self)
28 }
29 }
30 };
31}
32
33source_repr_prim!(u8);
34source_repr_prim!(u16);
35source_repr_prim!(u32);
36source_repr_prim!(u64);
37source_repr_prim!(i8);
38source_repr_prim!(i16);
39source_repr_prim!(i32);
40source_repr_prim!(i64);
41source_repr_prim!(usize);
42source_repr_prim!(isize);
43source_repr_prim!(f32);
44source_repr_prim!(f64);
45source_repr_prim!(char);
46
47source_repr_prim!(Option<u8>);
48source_repr_prim!(Option<u16>);
49source_repr_prim!(Option<u32>);
50source_repr_prim!(Option<u64>);
51source_repr_prim!(Option<i8>);
52source_repr_prim!(Option<i16>);
53source_repr_prim!(Option<i32>);
54source_repr_prim!(Option<i64>);
55source_repr_prim!(Option<usize>);
56source_repr_prim!(Option<isize>);
57source_repr_prim!(Option<f32>);
58source_repr_prim!(Option<f64>);