From 7a382043e173b5ae9a7cc8e6f12323790b8e3089 Mon Sep 17 00:00:00 2001 From: thojest Date: Fri, 22 Feb 2019 15:54:18 +0100 Subject: [PATCH] added test_random_derive implementation (lighthouse-246) --- eth2/utils/test_random_derive/src/lib.rs | 38 ++++++++++++++++++++---- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/eth2/utils/test_random_derive/src/lib.rs b/eth2/utils/test_random_derive/src/lib.rs index 27e62d31a..2c244e448 100644 --- a/eth2/utils/test_random_derive/src/lib.rs +++ b/eth2/utils/test_random_derive/src/lib.rs @@ -2,14 +2,42 @@ extern crate proc_macro; use crate::proc_macro::TokenStream; use quote::quote; -use syn; -use syn::DeriveInput; +use syn::{parse_macro_input, DeriveInput}; #[proc_macro_derive(TestRandom)] pub fn test_random_derive(input: TokenStream) -> TokenStream { - let ast = syn::parse(input).unwrap(); + let ast = parse_macro_input!(input as DeriveInput); + let name = &ast.ident; - impl_test_random(&ast) + let struct_data = match &ast.data { + syn::Data::Struct(s) => s, + _ => panic!("test_random_derive only supports structs."), + }; + + let field_names = get_named_field_idents_and_types(&struct_data); + + let output = quote! { + impl TestRandom for #name { + fn random_for_test(rng: &mut T) -> Self { + Self { + #( + #field_names: <_>::random_for_test(rng) + )* + } + } + } + }; + + output.into() } -fn impl_test_random(ast: &DeriveInput) -> TokenStream {} +fn get_named_field_idents_and_types(struct_data: &syn::DataStruct) -> Vec<(&syn::Ident)> { + struct_data + .fields + .iter() + .map(|f| match &f.ident { + Some(ref ident) => ident, + _ => panic!("test_random_derive only supports named struct fields."), + }) + .collect() +}