@@ -42,6 +42,12 @@ fn decodable_body(
42
42
}
43
43
let ty_name = s. ast ( ) . ident . to_string ( ) ;
44
44
let decode_body = match s. variants ( ) {
45
+ [ ] => {
46
+ let message = format ! ( "`{}` has no variants to decode" , ty_name) ;
47
+ quote ! {
48
+ panic!( #message)
49
+ }
50
+ }
45
51
[ vi] => vi. construct ( |field, _index| decode_field ( field) ) ,
46
52
variants => {
47
53
let match_inner: TokenStream = variants
@@ -139,6 +145,11 @@ fn encodable_body(
139
145
} ) ;
140
146
141
147
let encode_body = match s. variants ( ) {
148
+ [ ] => {
149
+ quote ! {
150
+ match * self { }
151
+ }
152
+ }
142
153
[ _] => {
143
154
let encode_inner = s. each_variant ( |vi| {
144
155
vi. bindings ( )
@@ -160,6 +171,23 @@ fn encodable_body(
160
171
}
161
172
}
162
173
_ => {
174
+ let disc = {
175
+ let mut variant_idx = 0usize ;
176
+ let encode_inner = s. each_variant ( |_| {
177
+ let result = quote ! {
178
+ #variant_idx
179
+ } ;
180
+ variant_idx += 1 ;
181
+ result
182
+ } ) ;
183
+ quote ! {
184
+ let disc = match * self {
185
+ #encode_inner
186
+ } ;
187
+ :: rustc_serialize:: Encoder :: emit_usize( __encoder, disc) ;
188
+ }
189
+ } ;
190
+
163
191
let mut variant_idx = 0usize ;
164
192
let encode_inner = s. each_variant ( |vi| {
165
193
let encode_fields: TokenStream = vi
@@ -176,26 +204,11 @@ fn encodable_body(
176
204
result
177
205
} )
178
206
. collect ( ) ;
179
-
180
- let result = if !vi. bindings ( ) . is_empty ( ) {
181
- quote ! {
182
- :: rustc_serialize:: Encoder :: emit_enum_variant(
183
- __encoder,
184
- #variant_idx,
185
- |__encoder| { #encode_fields }
186
- )
187
- }
188
- } else {
189
- quote ! {
190
- :: rustc_serialize:: Encoder :: emit_fieldless_enum_variant:: <#variant_idx>(
191
- __encoder,
192
- )
193
- }
194
- } ;
195
207
variant_idx += 1 ;
196
- result
208
+ encode_fields
197
209
} ) ;
198
210
quote ! {
211
+ #disc
199
212
match * self {
200
213
#encode_inner
201
214
}
0 commit comments