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}