Skip to content

Commit 16391c0

Browse files
sampocsiboss-ptk
authored andcommitted
automated as_str_vec serialization
1 parent 165a60e commit 16391c0

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

packages/proto-build/src/transform.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,8 @@ fn transform_items(
161161
let s = transformers::add_derive_eq_struct(&s);
162162
let s = transformers::append_attrs_struct(src, &s, descriptor);
163163
let s = transformers::serde_alias_id_with_uppercased(s);
164-
transformers::allow_serde_int_as_str(s)
164+
let s = transformers::allow_serde_int_as_str(s);
165+
transformers::allow_serde_vec_int_as_vec_str(s)
165166
}),
166167

167168
Item::Enum(e) => Item::Enum({

packages/proto-build/src/transformers.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,50 @@ pub fn allow_serde_int_as_str(s: ItemStruct) -> ItemStruct {
191191
syn::ItemStruct { fields, ..s }
192192
}
193193

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+
194238
/// some of proto's fields in osmosis' modules are named `ID` but prost generates `id` field
195239
/// this function adds `#[serde(alias = "ID")]` to the `id` field
196240
/// so that serde can deserialize `ID` field to `id` field.

0 commit comments

Comments
 (0)