ghost_lite/
lib.rs

1#![doc = include_str!("../README.md")]
2
3#[doc(hidden)]
4pub mod macro_docs {
5    pub mod inner_attr {
6        /// Specify a `mod` name which exports the value namespace.
7        /// Defaults to `__impl_value_namespace`.
8        pub mod mod_value_namespace {}
9
10        /// Generate code for some traits.
11        pub mod derive {
12            pub use ::core::clone::Clone;
13            pub use ::core::cmp::{Eq, Ord, PartialEq, PartialOrd};
14            pub use ::core::default::Default;
15            pub use ::core::fmt::Debug;
16            pub use ::core::hash::Hash;
17            pub use ::core::marker::Copy;
18        }
19    }
20}
21
22#[doc(hidden)]
23#[macro_export]
24macro_rules! expand_a_or_b {
25    ([][$($b:tt)*]) => {
26        $($b)*
27    };
28    ([$($a:tt)+][$($b:tt)*]) => {
29        $($a)+
30    };
31}
32
33#[doc(hidden)]
34#[macro_export]
35macro_rules! __impl_value_namespace {
36    ([] $vis:tt $name:ident) => {
37        $crate::__impl_value_namespace! {
38            [__impl_value_namespace] $vis $name
39        }
40    };
41    ([$mod_value_namespace:ident] {$($vis:tt)*} $name:ident) => {
42        mod $mod_value_namespace {
43            $crate::__impl_value_namespace_use! {
44                $name $($vis)*
45            }
46        }
47
48        #[doc(hidden)]
49        $($vis)* use $mod_value_namespace::*;
50    };
51}
52
53#[doc(hidden)]
54#[macro_export]
55macro_rules! __impl_value_namespace_use {
56    ($name:ident) => {
57        pub(super) use super::$name::$name;
58    };
59    ($name:ident pub) => {
60        pub use super::$name::$name;
61    };
62    ($name:ident pub($(in)? self $($p:tt)*)) => {
63        pub(in super $($p)*) use super::$name::$name;
64    };
65    ($name:ident pub($(in)? super $($p:tt)*)) => {
66        pub(in super::super $($p)*) use super::$name::$name;
67    };
68    ($name:ident pub($(in)? crate $($p:tt)*)) => {
69        pub(in crate $($p)*) use super::$name::$name;
70    };
71    ($name:ident $($vis:tt)+) => {
72        pub(super) use super::$name::$name;
73    };
74}
75
76#[doc(hidden)]
77#[macro_export]
78macro_rules! __impl_phantom_types {
79    ([$($type_generic:tt)*]) => {
80        (
81            $( $crate::__impl_phantom_type![$type_generic] ,)*
82        )
83    };
84}
85
86#[doc(hidden)]
87#[macro_export]
88macro_rules! __impl_phantom_type {
89    ({$lt:lifetime}) => {
90        & $lt ()
91    };
92    ({{const $const_ident:ident} $($t:tt)*}) => {
93        ()
94    };
95    ({{} $($t:tt)*}) => {
96        ::core::marker::PhantomData<$($t)*>
97        // compile_error!{stringify!($($t)*)}
98    };
99}
100
101#[doc(hidden)]
102#[macro_export]
103macro_rules! __impl_inner_attr {
104    (
105        $vis:tt $name:ident $data:tt
106        mod_value_namespace $(= $mod_value_namespace:ident)?
107    ) => {
108        $crate::__impl_value_namespace! {
109            [$($mod_value_namespace)?]
110            $vis
111            $name
112        }
113    };
114    (
115        $vis:tt $name:ident $data:tt
116        derive $(( $($derive_macro_name:ident),* $(,)? ))?
117    ) => {
118        $($(
119            $crate::__impl_derive_macro! {
120                $derive_macro_name
121                $derive_macro_name
122                $name $data
123            }
124        )*)?
125    };
126}
127
128#[doc(hidden)]
129#[macro_export]
130macro_rules! __impl_derive_macro {
131    (Copy $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
132        impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
133            for $name<$($type_generics)*> $($where_clause)* {}
134    };
135    (Clone $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
136        impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
137            for $name<$($type_generics)*> $($where_clause)* {
138            #[inline]
139            fn clone(&self) -> Self {
140                Self::$name
141            }
142        }
143    };
144    (Default $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
145        impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
146            for $name<$($type_generics)*> $($where_clause)* {
147            #[inline]
148            fn default() -> Self {
149                Self::$name
150            }
151        }
152    };
153    (Hash $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
154        impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
155            for $name<$($type_generics)*> $($where_clause)* {
156            #[inline]
157            fn hash<H: ::core::hash::Hasher>(&self, _: &mut H) {}
158        }
159    };
160    (PartialOrd $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
161        impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
162            for $name<$($type_generics)*> $($where_clause)* {
163            fn partial_cmp(&self, _other: &Self) -> Option<::core::cmp::Ordering> {
164                ::core::option::Option::Some(::core::cmp::Ordering::Equal)
165            }
166        }
167    };
168    (Ord $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
169        impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
170            for $name<$($type_generics)*> $($where_clause)* {
171            fn cmp(&self, _other: &Self) -> ::core::cmp::Ordering {
172                ::core::cmp::Ordering::Equal
173            }
174        }
175    };
176    (PartialEq $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
177        impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
178            for $name<$($type_generics)*> $($where_clause)* {
179            fn eq(&self, _other: &Self) -> ::core::primitive::bool {
180                true
181            }
182        }
183    };
184    (Eq $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
185        impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
186            for $name<$($type_generics)*> $($where_clause)* {
187        }
188    };
189    (Debug $derive_macro_name:ident $name:ident { $rest:tt [$($impl_generics:tt)*][$($type_generics:tt)*][$($where_clause:tt)*] } ) => {
190        impl<$($impl_generics)*> $crate::macro_docs::inner_attr::derive::$derive_macro_name
191            for $name<$($type_generics)*> $($where_clause)* {
192            fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> ::core::fmt::Result {
193                write!(f, ::core::stringify!($name))
194            }
195        }
196    };
197}
198
199#[doc(hidden)]
200#[macro_export]
201macro_rules! __impl_ghost {
202    ($data:tt $phantom_types:tt) => {
203        $crate::__impl_ghost_enum! { $data $phantom_types }
204        $crate::__impl_ghost_inner_attrs! { $data }
205    };
206}
207
208#[doc(hidden)]
209#[macro_export]
210macro_rules! __impl_ghost_enum {
211    ({
212        {
213            $attrs_inner:tt
214            {$($attr:tt)*}
215            {$($vis:tt)*}
216            $name:ident
217        }
218        {$($rest:tt)+}
219        $impl_generics:tt
220        $type_generics:tt
221        $where_clause:tt
222    } $phantom_types:tt) => {
223        $($attr)*
224        $($vis)* enum $name<$($rest)+ {
225            $name,
226            #[doc(hidden)]
227            __Phantom(
228                ::core::convert::Infallible,
229                ::core::marker::PhantomData<
230                    $crate::__impl_phantom_types![$phantom_types]
231                >
232            ),
233        }
234    };
235}
236
237#[doc(hidden)]
238#[macro_export]
239macro_rules! __impl_ghost_inner_attrs {
240    ({
241        {
242            {$(#![$inner_attr_name:ident $($inner_attr:tt)* ])*}
243            $attrs:tt
244            $vis:tt
245            $name:ident
246        }
247        $rest:tt
248        $impl_generics:tt
249        $type_generics:tt
250        $where_clause:tt
251    }) => {
252        $(
253            $crate::__impl_inner_attr! {
254                $vis $name
255                {$rest $impl_generics $type_generics $where_clause}
256                $inner_attr_name $($inner_attr)*
257            }
258        )*
259    };
260}
261
262#[doc(hidden)]
263#[macro_export]
264macro_rules! __impl_resolve_type_generics_expand {
265    (
266        $data:tt
267        $rest:tt
268    ) => {
269        $crate::__impl_resolve_type_generics! {
270            $data
271            $rest
272            $rest
273        }
274    };
275}
276
277#[doc(hidden)]
278#[macro_export]
279macro_rules! __impl_resolve_type_generics {
280    (
281        $data:tt
282        $rest:tt
283        {
284            $(
285                $lt:lifetime
286                $(:
287                    $($lt_bound:lifetime)?
288                    $(+ $lt_bounds:lifetime)*
289                )?
290            ),*
291            $($($ignore_comma:literal)? ,)?
292            $(
293                $const_or_tp:ident
294                $($tp:ident)?
295                $(:
296                    $($tp_lt_bound:lifetime)?
297                    $(+ $tp_lt_bounds:lifetime)*
298                    $($($ignore:literal)? +)?
299                    $(
300                        $(? $($tp_bound_relax_ignore:literal)?)?
301                        $tp_bound:path
302                    )?
303                )?
304            ),*
305            $(,)?
306            >
307            $(where $($where_clause:tt)*)?
308        }
309    ) => {
310        $crate::__impl_ghost! {
311            {
312                $data
313                $rest
314                // impl generics
315                [
316                    $(
317                        $lt
318                        $(:
319                            $($lt_bound)?
320                            $(+ $lt_bounds)*
321                        )?
322                    ),*
323                    $($($ignore_comma)? ,)?
324                    $(
325                        $const_or_tp
326                        $($tp)?
327                        $(:
328                            $($tp_lt_bound)?
329                            $(+ $tp_lt_bounds)*
330                            $($($ignore)? +)?
331                            $(
332                                $(? $($tp_bound_relax_ignore)?)?
333                                $tp_bound
334                            )?
335                        )?
336                    ),*
337                ]
338                // type generics
339                [
340                    $(
341                        $lt
342                    ),*
343                    $($($ignore_comma)? ,)?
344                    $(
345                        $crate::expand_a_or_b![
346                            [$($tp)?]
347                            [$const_or_tp]
348                        ]
349                    ),*
350                ]
351                // where clause
352                [$(where $($where_clause)*)?]
353            }
354            // phantom types
355            [
356                $({ $lt })*
357                $({
358                    {$(const $tp)?}
359                    $crate::expand_a_or_b![
360                        [$($tp)?]
361                        [$const_or_tp]
362                    ]
363                })*
364            ]
365        }
366    };
367}
368
369#[doc(hidden)]
370#[macro_export]
371macro_rules! __impl_default_mod_value_namespace {
372    (
373        $vis:tt $name:ident
374        $([mod_value_namespace $(= $mod_value_namespace:ident)?])?
375        $([derive $($rest:tt)*])*
376    ) => {
377        $crate::__impl_default_mod_value_namespace_impl! {
378            $vis $name
379            $(mod_value_namespace $(= $mod_value_namespace)?)?
380        }
381    };
382}
383
384#[doc(hidden)]
385#[macro_export]
386macro_rules! __impl_default_mod_value_namespace_impl {
387    ($vis:tt $name:ident mod_value_namespace $($rest:tt)*) => {};
388    ($vis:tt $name:ident) => {
389        $crate::__impl_value_namespace! {
390            []
391            $vis
392            $name
393        }
394    };
395}
396
397#[macro_export]
398macro_rules! ghost {
399    (
400        $(#![$attr_inner_name:ident $($attr_inner:tt)*])*
401        $(#[$($attr:tt)*])*
402        $(pub $( ($($vis_path:tt)*) )?)?
403        struct $name:ident <
404            $($rest:tt)+
405    ) => {
406        $(
407            #[allow(unused_imports)]
408            use $crate::macro_docs::inner_attr::$attr_inner_name as _;
409        )*
410
411        $crate::__impl_resolve_type_generics_expand! {
412            {
413                {$(#![$attr_inner_name $($attr_inner)*])*}
414                {$(#[$($attr)*])*}
415                {$(pub $( ($($vis_path)*) )?)?}
416                $name
417            }
418            {$($rest)+}
419        }
420
421        $crate::__impl_default_mod_value_namespace! {
422            {$(pub $( ($($vis_path)*) )?)?}
423            $name
424            $([$attr_inner_name $($attr_inner)*])*
425        }
426    };
427}