musli_macros/internals/
tokens.rs

1use proc_macro2::Span;
2
3pub(crate) struct Tokens {
4    pub(crate) as_decoder_t: syn::Path,
5    pub(crate) context_t: syn::Path,
6    pub(crate) decode_bytes_t: syn::Path,
7    pub(crate) decode_packed_t: syn::Path,
8    pub(crate) decode_t: syn::Path,
9    pub(crate) decoder_t: syn::Path,
10    pub(crate) default_function: syn::Path,
11    pub(crate) encode_bytes_t: syn::Path,
12    pub(crate) encode_packed_t: syn::Path,
13    pub(crate) encode_t: syn::Path,
14    pub(crate) encoder_t: syn::Path,
15    pub(crate) fmt: syn::Path,
16    pub(crate) map_decoder_t: syn::Path,
17    pub(crate) map_encoder_t: syn::Path,
18    pub(crate) map_entry_encoder_t: syn::Path,
19    pub(crate) map_hint: syn::Path,
20    pub(crate) option_none: syn::Path,
21    pub(crate) option_some: syn::Path,
22    pub(crate) option: syn::Path,
23    pub(crate) pack_decoder_t: syn::Path,
24    pub(crate) result_err: syn::Path,
25    pub(crate) result_ok: syn::Path,
26    pub(crate) result: syn::Path,
27    pub(crate) sequence_encoder_t: syn::Path,
28    pub(crate) skip_field: syn::Path,
29    pub(crate) skip: syn::Path,
30    pub(crate) struct_field_decoder_t: syn::Path,
31    pub(crate) trace_decode_t: syn::Path,
32    pub(crate) trace_encode_t: syn::Path,
33    pub(crate) variant_decoder_t: syn::Path,
34    pub(crate) variant_encoder_t: syn::Path,
35    pub(crate) prefix: syn::Path,
36}
37
38impl Tokens {
39    pub(crate) fn new(span: Span, prefix: syn::Path) -> Self {
40        Self {
41            as_decoder_t: path(span, &prefix, ["de", "AsDecoder"]),
42            context_t: path(span, &prefix, ["Context"]),
43            decode_bytes_t: path(span, &prefix, ["de", "DecodeBytes"]),
44            decode_packed_t: path(span, &prefix, ["de", "DecodePacked"]),
45            decode_t: path(span, &prefix, ["de", "Decode"]),
46            decoder_t: path(span, &prefix, ["de", "Decoder"]),
47            default_function: path(span, &prefix, ["__priv", "default"]),
48            encode_bytes_t: path(span, &prefix, ["en", "EncodeBytes"]),
49            encode_packed_t: path(span, &prefix, ["en", "EncodePacked"]),
50            encode_t: path(span, &prefix, ["en", "Encode"]),
51            encoder_t: path(span, &prefix, ["en", "Encoder"]),
52            fmt: path(span, &prefix, ["__priv", "fmt"]),
53            map_decoder_t: path(span, &prefix, ["de", "MapDecoder"]),
54            map_encoder_t: path(span, &prefix, ["en", "MapEncoder"]),
55            map_entry_encoder_t: path(span, &prefix, ["en", "EntryEncoder"]),
56            map_hint: path(span, &prefix, ["hint", "MapHint"]),
57            option_none: path(span, &prefix, ["__priv", "None"]),
58            option_some: path(span, &prefix, ["__priv", "Some"]),
59            option: path(span, &prefix, ["__priv", "Option"]),
60            pack_decoder_t: path(span, &prefix, ["de", "SequenceDecoder"]),
61            result_err: path(span, &prefix, ["__priv", "Err"]),
62            result_ok: path(span, &prefix, ["__priv", "Ok"]),
63            result: path(span, &prefix, ["__priv", "Result"]),
64            sequence_encoder_t: path(span, &prefix, ["en", "SequenceEncoder"]),
65            skip_field: path(span, &prefix, ["__priv", "skip_field"]),
66            skip: path(span, &prefix, ["__priv", "skip"]),
67            struct_field_decoder_t: path(span, &prefix, ["de", "EntryDecoder"]),
68            trace_decode_t: path(span, &prefix, ["de", "DecodeTrace"]),
69            trace_encode_t: path(span, &prefix, ["en", "EncodeTrace"]),
70            variant_decoder_t: path(span, &prefix, ["de", "VariantDecoder"]),
71            variant_encoder_t: path(span, &prefix, ["en", "VariantEncoder"]),
72            prefix,
73        }
74    }
75}
76
77fn path<const N: usize>(span: Span, prefix: &syn::Path, segments: [&'static str; N]) -> syn::Path {
78    let mut path = prefix.clone();
79
80    for segment in segments {
81        path.segments.push(syn::Ident::new(segment, span).into());
82    }
83
84    path
85}