根据结构字段的类型创建结构的宏

Macro that makes struct based on struct field's types

我正在尝试创建一个宏来生成具有新函数实现的结构。新建函数需要根据字段类型调用函数,使用return值作为字段值

新的实现应该像这样工作:

struct foo {
    test: i32,
    other: String,
}

impl foo {
    fn new() -> Self {
        foo {
           test: get_i32(),
           other: get_string(),
        }
    }
}

这是我目前的代码:

macro_rules! test {
    (struct $name:ident { $($fname:ident : $ftype:ty),* }) => {
        #[derive(Debug)]
        pub struct $name {
            $(pub $fname : $ftype),*
        }

        impl $name {
            fn new(mut v: Vec<u8>) -> Self {
                $name {
                    $($fname : ),*
                }
            }
        }
    };
}

我试过输入匹配语句,但它给出了不兼容的武器类型错误。

impl $name {
    fn new(mut v: Vec<u8>) -> Self {
        $name {
            $($fname : match &stringify!($ftype)[..] {
                "i32" => get_i32(),
                "String" => get_string(),
            }),*
        }
    }
}

谢谢。

我设法使用了另一个 returns any 函数来让它工作。

macro_rules! test {
    (struct $name:ident { $($fname:ident : $ftype:ty),* }) => {
        #[derive(Debug)]
        pub struct $name {
            $(pub $fname : $ftype),*
        }

        impl $name {
            fn new(mut v: Vec<u8>) -> Self {
                $name {
                    $($fname : get_feild::<$ftype>(stringify!($ftype)).downcast_ref::<$ftype>().unwrap().clone()),*
                }
            }
        }
    };
}

fn get_feild<T>(t: &str) -> Box<dyn std::any::Any> {
    match t {
        "i32" => Box::new(get_i32()),
        "String" => Box::new(get_string()),
        _ => panic!("UNKNOWN TYPE"),
    }
}