MCPcopy Create free account
hub / github.com/SoftbearStudios/bitcode / enum_impl

Method enum_impl

bitcode_derive/src/decode.rs:84–215  ·  view source on GitHub ↗
(
        self,
        variant_count: usize,
        pattern: impl Fn(usize) -> TokenStream,
        inner: impl Fn(Self, usize) -> TokenStream,
    )

Source from the content-addressed store, hash-verified

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);

Callers

nothing calls this directly

Calls 4

de_lifetimeFunction · 0.85
privateFunction · 0.85
variant_indexFunction · 0.85
collectMethod · 0.45

Tested by

no test coverage detected