1 #![allow(
2     clippy::no_effect_underscore_binding,
3     clippy::too_many_lines,
4     clippy::used_underscore_binding
5 )]
6 
7 #[rustfmt::skip]
8 mod gen;
9 
10 use proc_macro2::{Ident, Literal, TokenStream};
11 use ref_cast::RefCast;
12 use std::fmt::{self, Debug};
13 use std::ops::Deref;
14 use syn::punctuated::Punctuated;
15 
16 #[derive(RefCast)]
17 #[repr(transparent)]
18 pub struct Lite<T: ?Sized> {
19     value: T,
20 }
21 
22 #[allow(non_snake_case)]
Lite<T: ?Sized>(value: &T) -> &Lite<T>23 pub fn Lite<T: ?Sized>(value: &T) -> &Lite<T> {
24     Lite::ref_cast(value)
25 }
26 
27 impl<T: ?Sized> Deref for Lite<T> {
28     type Target = T;
29 
deref(&self) -> &Self::Target30     fn deref(&self) -> &Self::Target {
31         &self.value
32     }
33 }
34 
35 impl Debug for Lite<bool> {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result36     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
37         write!(formatter, "{}", self.value)
38     }
39 }
40 
41 impl Debug for Lite<u32> {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result42     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
43         write!(formatter, "{}", self.value)
44     }
45 }
46 
47 impl Debug for Lite<usize> {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result48     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
49         write!(formatter, "{}", self.value)
50     }
51 }
52 
53 impl Debug for Lite<String> {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result54     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
55         write!(formatter, "{:?}", self.value)
56     }
57 }
58 
59 impl Debug for Lite<Ident> {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result60     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
61         write!(formatter, "{:?}", self.value.to_string())
62     }
63 }
64 
65 impl Debug for Lite<Literal> {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result66     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
67         write!(formatter, "{}", self.value)
68     }
69 }
70 
71 impl Debug for Lite<TokenStream> {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result72     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
73         let string = self.value.to_string();
74         if string.len() <= 80 {
75             write!(formatter, "TokenStream(`{}`)", self.value)
76         } else {
77             formatter
78                 .debug_tuple("TokenStream")
79                 .field(&format_args!("`{}`", string))
80                 .finish()
81         }
82     }
83 }
84 
85 impl<'a, T> Debug for Lite<&'a T>
86 where
87     Lite<T>: Debug,
88 {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result89     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
90         Debug::fmt(Lite(&*self.value), formatter)
91     }
92 }
93 
94 impl<T> Debug for Lite<Box<T>>
95 where
96     Lite<T>: Debug,
97 {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result98     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
99         Debug::fmt(Lite(&*self.value), formatter)
100     }
101 }
102 
103 impl<T> Debug for Lite<Vec<T>>
104 where
105     Lite<T>: Debug,
106 {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result107     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 }
114 
115 impl<T, P> Debug for Lite<Punctuated<T, P>>
116 where
117     Lite<T>: Debug,
118 {
fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result119     fn fmt(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
120         formatter
121             .debug_list()
122             .entries(self.value.iter().map(Lite))
123             .finish()
124     }
125 }
126