blob: c1180532ecf2662bfc56497e41244ccf337a4614 [file] [log] [blame]
David Tolnay3c3c7d12019-05-08 14:54:12 -07001extern crate proc_macro2;
2extern crate ref_cast;
3
4mod gen;
5
6use self::proc_macro2::{Ident, Literal, TokenStream};
7use self::ref_cast::RefCast;
8use std::fmt::{self, Debug};
9use std::ops::Deref;
10use syn::punctuated::Punctuated;
11
12#[derive(RefCast)]
13#[repr(transparent)]
14pub struct Lite<T: ?Sized> {
15 value: T,
16}
17
18#[allow(non_snake_case)]
19pub fn Lite<T: ?Sized>(value: &T) -> &Lite<T> {
20 Lite::ref_cast(value)
21}
22
23impl<T: ?Sized> Deref for Lite<T> {
24 type Target = T;
25
26 fn deref(&self) -> &Self::Target {
27 &self.value
28 }
29}
30
31impl Debug for Lite<bool> {
32 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
33 write!(formatter, "{}", self.value)
34 }
35}
36
37impl Debug for Lite<u32> {
38 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
39 write!(formatter, "{}", self.value)
40 }
41}
42
43impl Debug for Lite<usize> {
44 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
45 write!(formatter, "{}", self.value)
46 }
47}
48
49impl Debug for Lite<String> {
50 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
51 write!(formatter, "{:?}", self.value)
52 }
53}
54
55impl Debug for Lite<Ident> {
56 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
57 write!(formatter, "{:?}", self.value.to_string())
58 }
59}
60
61impl Debug for Lite<Literal> {
62 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
63 write!(formatter, "{}", self.value)
64 }
65}
66
67impl Debug for Lite<TokenStream> {
68 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
69 write!(formatter, "`{}`", self.value)
70 }
71}
72
David Tolnay4fd1bd32019-05-09 12:47:51 -070073impl<'a, T> Debug for Lite<&'a T>
74where
75 Lite<T>: Debug,
76{
77 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
78 Debug::fmt(Lite(&*self.value), formatter)
79 }
80}
81
David Tolnay3c3c7d12019-05-08 14:54:12 -070082impl<T> Debug for Lite<Box<T>>
83where
84 Lite<T>: Debug,
85{
86 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
87 Debug::fmt(Lite(&*self.value), formatter)
88 }
89}
90
91impl<T> Debug for Lite<Vec<T>>
92where
93 Lite<T>: Debug,
94{
95 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
96 formatter
97 .debug_list()
98 .entries(self.value.iter().map(Lite))
99 .finish()
100 }
101}
102
103impl<T, P> Debug for Lite<Punctuated<T, P>>
104where
105 Lite<T>: Debug,
106{
107 fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
108 formatter
109 .debug_list()
110 .entries(self.value.iter().map(Lite))
111 .finish()
112 }
113}