git.delta.rocks / unique-network / refs/commits / 4c9523749b30

difftreelog

feat add derive macro AbiCoder for unnamed struct to implement AbiType

Trubnikov Sergey2022-11-10parent: #7cb2015.patch.diff
in: master

3 files changed

modifiedcrates/evm-coder/procedural/src/abi_derive.rsdiffbeforeafterboth
5 let name = &ast.ident;5 let name = &ast.ident;
6 let can_be_plcaed_in_vec = impl_can_be_placed_in_vec(name);6 let can_be_plcaed_in_vec = impl_can_be_placed_in_vec(name);
7 let abi_type = impl_abi_type(ast);7 let abi_type = impl_abi_type(ast);
8 println!("{}", abi_type);8 // println!("{}", abi_type);
9 quote! {9 quote! {
10 #can_be_plcaed_in_vec10 #can_be_plcaed_in_vec
11 #abi_type11 #abi_type
18 }18 }
19}19}
20
21fn map_field_to_type<'a>(field: &'a syn::Field) -> &'a syn::Type {
22 &field.ty
23}
2024
21fn impl_abi_type(ast: &syn::DeriveInput) -> proc_macro2::TokenStream {25fn impl_abi_type(ast: &syn::DeriveInput) -> proc_macro2::TokenStream {
22 let name = &ast.ident;26 let name = &ast.ident;
23 let (fields, params_count) = match &ast.data {27 let (fields, params_count) = match &ast.data {
24 syn::Data::Struct(ds) => match ds.fields {28 syn::Data::Struct(ds) => match ds.fields {
25 syn::Fields::Named(ref fields) => (29 syn::Fields::Named(ref fields) => (
26 fields.named.iter().map(|field| &field.ty),30 fields.named.iter().map(map_field_to_type),
27 fields.named.len(),31 fields.named.len(),
28 ),32 ),
29 syn::Fields::Unnamed(_) => todo!(),33 syn::Fields::Unnamed(ref fields) => (
34 fields.unnamed.iter().map(map_field_to_type),
35 fields.unnamed.len(),
36 ),
30 syn::Fields::Unit => unimplemented!("Unit structs not supported"),37 syn::Fields::Unit => unimplemented!("Unit structs not supported"),
31 },38 },
32 syn::Data::Enum(_) => unimplemented!("Enums not supported"),39 syn::Data::Enum(_) => unimplemented!("Enums not supported"),
modifiedcrates/evm-coder/procedural/src/lib.rsdiffbeforeafterboth
248pub fn abi_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {248pub fn abi_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
249 let ast = syn::parse(input).unwrap();249 let ast = syn::parse(input).unwrap();
250 let ts = abi_derive::impl_abi_macro(&ast);250 let ts = abi_derive::impl_abi_macro(&ast);
251 println!("{}", &ts);251 // println!("{}", &ts);
252 ts.into()252 ts.into()
253}253}
254254
modifiedcrates/evm-coder/tests/abi_derive_generation.rsdiffbeforeafterboth
64 _c: TypeStruct2MixedParam,64 _c: TypeStruct2MixedParam,
65}65}
66
67#[test]
68fn empty() {}
6669
67#[test]70#[test]
68fn impl_abi_type_signature() {71fn impl_abi_type_signature() {
202 );205 );
203}206}
207
208#[derive(AbiCoder)]
209struct TupleStruct1SimpleParam(u8);
210
211#[derive(AbiCoder)]
212struct TupleStruct1DynamicParam(String);
213
214#[derive(AbiCoder)]
215struct TupleStruct2SimpleParam(u8, u32);
216
217#[derive(AbiCoder)]
218struct TupleStruct2DynamicParam(String, bytes);
219
220#[derive(AbiCoder)]
221struct TupleStruct2MixedParam(u8, bytes);
222
223#[derive(AbiCoder)]
224struct TupleStruct1DerivedSimpleParam(TupleStruct1SimpleParam);
225
226#[derive(AbiCoder)]
227struct TupleStruct2DerivedSimpleParam(TupleStruct1SimpleParam, TupleStruct2SimpleParam);
228
229#[derive(AbiCoder)]
230struct TupleStruct1DerivedDynamicParam(TupleStruct1DynamicParam);
231
232#[derive(AbiCoder)]
233struct TupleStruct2DerivedDynamicParam(TupleStruct1DynamicParam, TupleStruct2DynamicParam);
234
235#[derive(AbiCoder)]
236struct TupleStruct3DerivedMixedParam(
237 TupleStruct1SimpleParam,
238 TupleStruct2DynamicParam,
239 TupleStruct2MixedParam,
240);
241
242#[test]
243fn impl_abi_type_signature_same_for_structs() {
244 assert_eq!(
245 <TypeStruct1SimpleParam as AbiType>::SIGNATURE
246 .as_str()
247 .unwrap(),
248 <TupleStruct1SimpleParam as AbiType>::SIGNATURE
249 .as_str()
250 .unwrap()
251 );
252 assert_eq!(
253 <TypeStruct1DynamicParam as AbiType>::SIGNATURE
254 .as_str()
255 .unwrap(),
256 <TupleStruct1DynamicParam as AbiType>::SIGNATURE
257 .as_str()
258 .unwrap()
259 );
260 assert_eq!(
261 <TypeStruct2SimpleParam as AbiType>::SIGNATURE
262 .as_str()
263 .unwrap(),
264 <TupleStruct2SimpleParam as AbiType>::SIGNATURE
265 .as_str()
266 .unwrap()
267 );
268 assert_eq!(
269 <TypeStruct2DynamicParam as AbiType>::SIGNATURE
270 .as_str()
271 .unwrap(),
272 <TupleStruct2DynamicParam as AbiType>::SIGNATURE
273 .as_str()
274 .unwrap()
275 );
276 assert_eq!(
277 <TypeStruct2MixedParam as AbiType>::SIGNATURE
278 .as_str()
279 .unwrap(),
280 <TupleStruct2MixedParam as AbiType>::SIGNATURE
281 .as_str()
282 .unwrap(),
283 );
284 assert_eq!(
285 <TypeStruct1DerivedSimpleParam as AbiType>::SIGNATURE
286 .as_str()
287 .unwrap(),
288 <TupleStruct1DerivedSimpleParam as AbiType>::SIGNATURE
289 .as_str()
290 .unwrap(),
291 );
292 assert_eq!(
293 <TypeStruct2DerivedSimpleParam as AbiType>::SIGNATURE
294 .as_str()
295 .unwrap(),
296 <TupleStruct2DerivedSimpleParam as AbiType>::SIGNATURE
297 .as_str()
298 .unwrap(),
299 );
300 assert_eq!(
301 <TypeStruct1DerivedDynamicParam as AbiType>::SIGNATURE
302 .as_str()
303 .unwrap(),
304 <TupleStruct1DerivedDynamicParam as AbiType>::SIGNATURE
305 .as_str()
306 .unwrap(),
307 );
308 assert_eq!(
309 <TypeStruct2DerivedDynamicParam as AbiType>::SIGNATURE
310 .as_str()
311 .unwrap(),
312 <TupleStruct2DerivedDynamicParam as AbiType>::SIGNATURE
313 .as_str()
314 .unwrap(),
315 );
316 assert_eq!(
317 <TypeStruct3DerivedMixedParam as AbiType>::SIGNATURE
318 .as_str()
319 .unwrap(),
320 <TupleStruct3DerivedMixedParam as AbiType>::SIGNATURE
321 .as_str()
322 .unwrap(),
323 );
324}
325
326#[test]
327fn impl_abi_type_is_dynamic_same_for_structs() {
328 assert_eq!(
329 <TypeStruct1SimpleParam as AbiType>::is_dynamic(),
330 <TupleStruct1SimpleParam as AbiType>::is_dynamic()
331 );
332 assert_eq!(
333 <TypeStruct1DynamicParam as AbiType>::is_dynamic(),
334 <TupleStruct1DynamicParam as AbiType>::is_dynamic()
335 );
336 assert_eq!(
337 <TypeStruct2SimpleParam as AbiType>::is_dynamic(),
338 <TupleStruct2SimpleParam as AbiType>::is_dynamic()
339 );
340 assert_eq!(
341 <TypeStruct2DynamicParam as AbiType>::is_dynamic(),
342 <TupleStruct2DynamicParam as AbiType>::is_dynamic()
343 );
344 assert_eq!(
345 <TypeStruct2MixedParam as AbiType>::is_dynamic(),
346 <TupleStruct2MixedParam as AbiType>::is_dynamic()
347 );
348 assert_eq!(
349 <TypeStruct1DerivedSimpleParam as AbiType>::is_dynamic(),
350 <TupleStruct1DerivedSimpleParam as AbiType>::is_dynamic()
351 );
352 assert_eq!(
353 <TypeStruct2DerivedSimpleParam as AbiType>::is_dynamic(),
354 <TupleStruct2DerivedSimpleParam as AbiType>::is_dynamic()
355 );
356 assert_eq!(
357 <TypeStruct1DerivedDynamicParam as AbiType>::is_dynamic(),
358 <TupleStruct1DerivedDynamicParam as AbiType>::is_dynamic()
359 );
360 assert_eq!(
361 <TypeStruct2DerivedDynamicParam as AbiType>::is_dynamic(),
362 <TupleStruct2DerivedDynamicParam as AbiType>::is_dynamic()
363 );
364 assert_eq!(
365 <TypeStruct3DerivedMixedParam as AbiType>::is_dynamic(),
366 <TupleStruct3DerivedMixedParam as AbiType>::is_dynamic()
367 );
368}
369
370#[test]
371fn impl_abi_type_size_same_for_structs() {
372 assert_eq!(
373 <TypeStruct1SimpleParam as AbiType>::size(),
374 <TupleStruct1SimpleParam as AbiType>::size()
375 );
376 assert_eq!(
377 <TypeStruct1DynamicParam as AbiType>::size(),
378 <TupleStruct1DynamicParam as AbiType>::size()
379 );
380 assert_eq!(
381 <TypeStruct2SimpleParam as AbiType>::size(),
382 <TupleStruct2SimpleParam as AbiType>::size()
383 );
384 assert_eq!(
385 <TypeStruct2DynamicParam as AbiType>::size(),
386 <TupleStruct2DynamicParam as AbiType>::size()
387 );
388 assert_eq!(
389 <TypeStruct2MixedParam as AbiType>::size(),
390 <TupleStruct2MixedParam as AbiType>::size()
391 );
392 assert_eq!(
393 <TypeStruct1DerivedSimpleParam as AbiType>::size(),
394 <TupleStruct1DerivedSimpleParam as AbiType>::size()
395 );
396 assert_eq!(
397 <TypeStruct2DerivedSimpleParam as AbiType>::size(),
398 <TupleStruct2DerivedSimpleParam as AbiType>::size()
399 );
400 assert_eq!(
401 <TypeStruct1DerivedDynamicParam as AbiType>::size(),
402 <TupleStruct1DerivedDynamicParam as AbiType>::size()
403 );
404 assert_eq!(
405 <TypeStruct2DerivedDynamicParam as AbiType>::size(),
406 <TupleStruct2DerivedDynamicParam as AbiType>::size()
407 );
408 assert_eq!(
409 <TypeStruct3DerivedMixedParam as AbiType>::size(),
410 <TupleStruct3DerivedMixedParam as AbiType>::size()
411 );
412}
204413