@@ -191,6 +191,50 @@ pub fn allow_serde_int_as_str(s: ItemStruct) -> ItemStruct {
191
191
syn:: ItemStruct { fields, ..s }
192
192
}
193
193
194
+ pub fn allow_serde_vec_int_as_vec_str ( s : ItemStruct ) -> ItemStruct {
195
+ let fields_vec = s
196
+ . fields
197
+ . clone ( )
198
+ . into_iter ( )
199
+ . map ( |mut field| {
200
+ let int_types = vec ! [
201
+ parse_quote!( vec![ i8 ] ) ,
202
+ parse_quote!( vec![ i16 ] ) ,
203
+ parse_quote!( vec![ i32 ] ) ,
204
+ parse_quote!( vec![ i64 ] ) ,
205
+ parse_quote!( vec![ i128 ] ) ,
206
+ parse_quote!( vec![ isize ] ) ,
207
+ parse_quote!( vec![ u8 ] ) ,
208
+ parse_quote!( vec![ u16 ] ) ,
209
+ parse_quote!( vec![ u32 ] ) ,
210
+ parse_quote!( vec![ u64 ] ) ,
211
+ parse_quote!( vec![ u128 ] ) ,
212
+ parse_quote!( vec![ usize ] ) ,
213
+ ] ;
214
+
215
+ if int_types. contains ( & field. ty ) {
216
+ let from_str: syn:: Attribute = parse_quote ! {
217
+ #[ serde(
218
+ serialize_with = "crate::serde::as_str_vec::serialize" ,
219
+ deserialize_with = "crate::serde::as_str_vec::deserialize"
220
+ ) ]
221
+ } ;
222
+ field. attrs . append ( & mut vec ! [ from_str] ) ;
223
+ field
224
+ } else {
225
+ field
226
+ }
227
+ } )
228
+ . collect :: < Vec < syn:: Field > > ( ) ;
229
+
230
+ let fields_named: syn:: FieldsNamed = parse_quote ! {
231
+ { #( #fields_vec, ) * }
232
+ } ;
233
+ let fields = syn:: Fields :: Named ( fields_named) ;
234
+
235
+ syn:: ItemStruct { fields, ..s }
236
+ }
237
+
194
238
/// some of proto's fields in osmosis' modules are named `ID` but prost generates `id` field
195
239
/// this function adds `#[serde(alias = "ID")]` to the `id` field
196
240
/// so that serde can deserialize `ID` field to `id` field.
0 commit comments