1
1
use super :: FieldAttribute ;
2
+ use crate :: CrateNameAttribute ;
2
3
use virtue:: generate:: { FnSelfArg , Generator , StreamBuilder } ;
3
4
use virtue:: parse:: { EnumVariant , Fields } ;
4
5
use virtue:: prelude:: * ;
5
6
6
7
const TUPLE_FIELD_PREFIX : & str = "field_" ;
7
8
8
- pub struct DeriveEnum {
9
+ pub ( crate ) struct DeriveEnum {
9
10
pub variants : Vec < EnumVariant > ,
11
+ pub crate_name : CrateNameAttribute ,
10
12
}
11
13
12
14
impl DeriveEnum {
@@ -20,17 +22,22 @@ impl DeriveEnum {
20
22
21
23
pub fn generate_encode ( self , generator : & mut Generator ) -> Result < ( ) > {
22
24
generator
23
- . impl_for ( "bincode:: Encode") ?
25
+ . impl_for ( self . crate_name . ty ( " Encode") ) ?
24
26
. modify_generic_constraints ( |generics, where_constraints| {
25
27
for g in generics. iter_generics ( ) {
26
- where_constraints. push_constraint ( g, "bincode::Encode" ) . unwrap ( ) ;
28
+ where_constraints
29
+ . push_constraint ( g, self . crate_name . ty ( "Encode" ) )
30
+ . unwrap ( ) ;
27
31
}
28
32
} )
29
33
. generate_fn ( "encode" )
30
- . with_generic ( "E" , [ "bincode:: enc::Encoder"] )
34
+ . with_generic_deps ( "E" , [ self . crate_name . ty ( " enc::Encoder") ] )
31
35
. with_self_arg ( FnSelfArg :: RefSelf )
32
36
. with_arg ( "encoder" , "&mut E" )
33
- . with_return_type ( "core::result::Result<(), bincode::error::EncodeError>" )
37
+ . with_return_type ( format ! (
38
+ "core::result::Result<(), {}::error::EncodeError>" ,
39
+ self . crate_name. name
40
+ ) )
34
41
. body ( |fn_body| {
35
42
fn_body. ident_str ( "match" ) ;
36
43
fn_body. ident_str ( "self" ) ;
@@ -76,7 +83,10 @@ impl DeriveEnum {
76
83
// }
77
84
match_body. group ( Delimiter :: Brace , |body| {
78
85
// variant index
79
- body. push_parsed ( "<u32 as bincode::Encode>::encode" ) ?;
86
+ body. push_parsed ( format ! (
87
+ "<u32 as {}::Encode>::encode" ,
88
+ self . crate_name. name
89
+ ) ) ?;
80
90
body. group ( Delimiter :: Parenthesis , |args| {
81
91
args. punct ( '&' ) ;
82
92
args. group ( Delimiter :: Parenthesis , |num| {
@@ -91,17 +101,21 @@ impl DeriveEnum {
91
101
body. punct ( ';' ) ;
92
102
// If we have any fields, encode them all one by one
93
103
for field_name in variant. fields . names ( ) {
94
- if field_name. attributes ( ) . has_attribute ( FieldAttribute :: WithSerde ) ? {
104
+ if field_name
105
+ . attributes ( )
106
+ . has_attribute ( FieldAttribute :: WithSerde ) ?
107
+ {
95
108
body. push_parsed ( format ! (
96
- "bincode::Encode::encode(&bincode::serde::Compat({}), encoder)?;" ,
109
+ "{0}::Encode::encode(&{0}::serde::Compat({1}), encoder)?;" ,
110
+ self . crate_name. name,
97
111
field_name. to_string_with_prefix( TUPLE_FIELD_PREFIX ) ,
98
112
) ) ?;
99
113
} else {
100
114
body. push_parsed ( format ! (
101
- "bincode::Encode::encode({}, encoder)?;" ,
115
+ "{0}::Encode::encode({1}, encoder)?;" ,
116
+ self . crate_name. name,
102
117
field_name. to_string_with_prefix( TUPLE_FIELD_PREFIX ) ,
103
- ) )
104
- ?;
118
+ ) ) ?;
105
119
}
106
120
}
107
121
body. push_parsed ( "Ok(())" ) ?;
@@ -142,7 +156,7 @@ impl DeriveEnum {
142
156
result. puncts ( "=>" ) ;
143
157
result. ident_str ( "Err" ) ;
144
158
result. group ( Delimiter :: Parenthesis , |err_inner| {
145
- err_inner. push_parsed ( "bincode:: error::DecodeError::UnexpectedVariant") ?;
159
+ err_inner. push_parsed ( self . crate_name . ty ( " error::DecodeError::UnexpectedVariant") ) ?;
146
160
err_inner. group ( Delimiter :: Brace , |variant_inner| {
147
161
variant_inner. ident_str ( "found" ) ;
148
162
variant_inner. punct ( ':' ) ;
@@ -159,7 +173,8 @@ impl DeriveEnum {
159
173
160
174
if self . variants . iter ( ) . any ( |i| i. has_fixed_value ( ) ) {
161
175
// we have fixed values, implement AllowedEnumVariants::Allowed
162
- variant_inner. push_parsed ( "bincode::error::AllowedEnumVariants::Allowed" ) ?;
176
+ variant_inner
177
+ . push_parsed ( self . crate_name . ty ( "error::AllowedEnumVariants::Allowed" ) ) ?;
163
178
variant_inner. group ( Delimiter :: Parenthesis , |allowed_inner| {
164
179
allowed_inner. punct ( '&' ) ;
165
180
allowed_inner. group ( Delimiter :: Bracket , |allowed_slice| {
@@ -176,7 +191,8 @@ impl DeriveEnum {
176
191
} else {
177
192
// no fixed values, implement a range
178
193
variant_inner. push_parsed ( format ! (
179
- "bincode::error::AllowedEnumVariants::Range {{ min: 0, max: {} }}" ,
194
+ "{0}::error::AllowedEnumVariants::Range {{ min: 0, max: {1} }}" ,
195
+ self . crate_name. name,
180
196
self . variants. len( ) - 1
181
197
) ) ?;
182
198
}
@@ -193,24 +209,28 @@ impl DeriveEnum {
193
209
let enum_name = generator. target_name ( ) . to_string ( ) ;
194
210
195
211
generator
196
- . impl_for ( "bincode:: Decode") ?
212
+ . impl_for ( self . crate_name . ty ( " Decode") ) ?
197
213
. modify_generic_constraints ( |generics, where_constraints| {
198
214
for g in generics. iter_generics ( ) {
199
- where_constraints. push_constraint ( g, "bincode:: Decode") . unwrap ( ) ;
215
+ where_constraints. push_constraint ( g, self . crate_name . ty ( " Decode") ) . unwrap ( ) ;
200
216
}
201
217
} )
202
218
. generate_fn ( "decode" )
203
- . with_generic ( "D" , [ "bincode:: de::Decoder"] )
219
+ . with_generic_deps ( "D" , [ self . crate_name . ty ( " de::Decoder") ] )
204
220
. with_arg ( "decoder" , "&mut D" )
205
- . with_return_type ( "core::result::Result<Self, bincode ::error::DecodeError>" )
221
+ . with_return_type ( format ! ( "core::result::Result<Self, {} ::error::DecodeError>" , self . crate_name . name ) )
206
222
. body ( |fn_builder| {
207
223
if self . variants . is_empty ( ) {
208
- fn_builder. push_parsed ( "core::result::Result::Err(bincode::error::DecodeError::EmptyEnum { type_name: core::any::type_name::<Self>() })" ) ?;
224
+ fn_builder. push_parsed ( format ! (
225
+ "core::result::Result::Err({}::error::DecodeError::EmptyEnum {{ type_name: core::any::type_name::<Self>() }})" ,
226
+ self . crate_name. name
227
+ ) ) ?;
209
228
} else {
210
229
fn_builder
211
- . push_parsed (
212
- "let variant_index = <u32 as bincode::Decode>::decode(decoder)?;" ,
213
- ) ?;
230
+ . push_parsed ( format ! (
231
+ "let variant_index = <u32 as {}::Decode>::decode(decoder)?;" ,
232
+ self . crate_name. name
233
+ ) ) ?;
214
234
fn_builder. push_parsed ( "match variant_index" ) ?;
215
235
fn_builder. group ( Delimiter :: Brace , |variant_case| {
216
236
for ( mut variant_index, variant) in self . iter_fields ( ) {
@@ -242,10 +262,16 @@ impl DeriveEnum {
242
262
variant_body. punct ( ':' ) ;
243
263
if field. attributes ( ) . has_attribute ( FieldAttribute :: WithSerde ) ? {
244
264
variant_body
245
- . push_parsed ( "<bincode::serde::Compat<_> as bincode::Decode>::decode(decoder)?.0," ) ?;
265
+ . push_parsed ( format ! (
266
+ "<{0}::serde::Compat<_> as {0}::Decode>::decode(decoder)?.0," ,
267
+ self . crate_name. name
268
+ ) ) ?;
246
269
} else {
247
270
variant_body
248
- . push_parsed ( "bincode::Decode::decode(decoder)?," ) ?;
271
+ . push_parsed ( format ! (
272
+ "{}::Decode::decode(decoder)?," ,
273
+ self . crate_name. name
274
+ ) ) ?;
249
275
}
250
276
}
251
277
Ok ( ( ) )
@@ -266,25 +292,29 @@ impl DeriveEnum {
266
292
267
293
pub fn generate_borrow_decode ( self , generator : & mut Generator ) -> Result < ( ) > {
268
294
// Remember to keep this mostly in sync with generate_decode
295
+ let crate_name = & self . crate_name ;
269
296
270
297
let enum_name = generator. target_name ( ) . to_string ( ) ;
271
298
272
- generator. impl_for_with_lifetimes ( "bincode:: BorrowDecode", & [ "__de" ] ) ?
299
+ generator. impl_for_with_lifetimes ( crate_name . ty ( " BorrowDecode") , [ "__de" ] ) ?
273
300
. modify_generic_constraints ( |generics, where_constraints| {
274
301
for g in generics. iter_generics ( ) {
275
- where_constraints. push_constraint ( g, "bincode:: enc::BorrowDecode") . unwrap ( ) ;
302
+ where_constraints. push_constraint ( g, crate_name . ty ( " enc::BorrowDecode") ) . unwrap ( ) ;
276
303
}
277
304
} )
278
305
. generate_fn ( "borrow_decode" )
279
- . with_generic ( "D" , [ "bincode:: de::BorrowDecoder<'__de>"] )
306
+ . with_generic_deps ( "D" , [ crate_name . ty ( " de::BorrowDecoder<'__de>") ] )
280
307
. with_arg ( "decoder" , "&mut D" )
281
- . with_return_type ( "core::result::Result<Self, bincode ::error::DecodeError>" )
308
+ . with_return_type ( format ! ( "core::result::Result<Self, {} ::error::DecodeError>" , crate_name . name ) )
282
309
. body ( |fn_builder| {
283
310
if self . variants . is_empty ( ) {
284
- fn_builder. push_parsed ( "core::result::Result::Err(bincode::error::DecodeError::EmptyEnum { type_name: core::any::type_name::<Self>() })" ) ?;
311
+ fn_builder. push_parsed ( format ! (
312
+ "core::result::Result::Err({}::error::DecodeError::EmptyEnum {{ type_name: core::any::type_name::<Self>() }})" ,
313
+ crate_name. name
314
+ ) ) ?;
285
315
} else {
286
316
fn_builder
287
- . push_parsed ( "let variant_index = <u32 as bincode ::Decode>::decode(decoder)?;" ) ?;
317
+ . push_parsed ( format ! ( "let variant_index = <u32 as {} ::Decode>::decode(decoder)?;" , crate_name . name ) ) ?;
288
318
fn_builder. push_parsed ( "match variant_index" ) ?;
289
319
fn_builder. group ( Delimiter :: Brace , |variant_case| {
290
320
for ( mut variant_index, variant) in self . iter_fields ( ) {
@@ -316,9 +346,9 @@ impl DeriveEnum {
316
346
variant_body. punct ( ':' ) ;
317
347
if field. attributes ( ) . has_attribute ( FieldAttribute :: WithSerde ) ? {
318
348
variant_body
319
- . push_parsed ( "<bincode ::serde::BorrowCompat<_> as bincode ::BorrowDecode>::borrow_decode(decoder)?.0,") ?;
349
+ . push_parsed ( format ! ( "<{0} ::serde::BorrowCompat<_> as {0} ::BorrowDecode>::borrow_decode(decoder)?.0,", crate_name . name ) ) ?;
320
350
} else {
321
- variant_body. push_parsed ( "bincode ::BorrowDecode::borrow_decode(decoder)?,") ?;
351
+ variant_body. push_parsed ( format ! ( "{} ::BorrowDecode::borrow_decode(decoder)?,", crate_name . name ) ) ?;
322
352
}
323
353
}
324
354
Ok ( ( ) )
0 commit comments