(
self,
variant_count: usize,
pattern: impl Fn(usize) -> TokenStream,
inner: impl Fn(Self, usize) -> TokenStream,
)
| 82 | } |
| 83 | |
| 84 | fn enum_impl( |
| 85 | self, |
| 86 | variant_count: usize, |
| 87 | pattern: impl Fn(usize) -> TokenStream, |
| 88 | inner: impl Fn(Self, usize) -> TokenStream, |
| 89 | ) -> TokenStream { |
| 90 | // if variant_count is 0 or 1 variants don't have to be decoded. |
| 91 | let decode_variants = variant_count > 1; |
| 92 | let never = variant_count == 0; |
| 93 | |
| 94 | match self { |
| 95 | Self::Type => { |
| 96 | let de = de_lifetime(); |
| 97 | let inners: TokenStream = (0..variant_count).map(|i| inner(self, i)).collect(); |
| 98 | let variants = decode_variants |
| 99 | .then(|| { |
| 100 | let private = private(); |
| 101 | let c_style = inners.is_empty(); |
| 102 | quote! { variants: #private::VariantDecoder<#de, #variant_count, #c_style>, } |
| 103 | }) |
| 104 | .unwrap_or_default(); |
| 105 | quote! { |
| 106 | #variants |
| 107 | #inners |
| 108 | } |
| 109 | } |
| 110 | Self::Default => { |
| 111 | let variants = decode_variants |
| 112 | .then(|| quote! { variants: Default::default(), }) |
| 113 | .unwrap_or_default(); |
| 114 | let inners: TokenStream = (0..variant_count).map(|i| inner(self, i)).collect(); |
| 115 | quote! { |
| 116 | #variants |
| 117 | #inners |
| 118 | } |
| 119 | } |
| 120 | Self::Populate => { |
| 121 | if never { |
| 122 | let private = private(); |
| 123 | return quote! { |
| 124 | if __length != 0 { |
| 125 | return #private::invalid_enum_variant(); |
| 126 | } |
| 127 | }; |
| 128 | } |
| 129 | |
| 130 | let variants = decode_variants |
| 131 | .then(|| { |
| 132 | quote! { self.variants.populate(input, __length)?; } |
| 133 | }) |
| 134 | .unwrap_or_default(); |
| 135 | let inners: TokenStream = (0..variant_count) |
| 136 | .map(|i| { |
| 137 | let inner = inner(self, i); |
| 138 | if inner.is_empty() { |
| 139 | quote! {} |
| 140 | } else { |
| 141 | let i = variant_index(i); |
nothing calls this directly
no test coverage detected