Enums Rust宏从另一个枚举生成枚举

Enums Rust宏从另一个枚举生成枚举,enums,rust,macros,metaprogramming,Enums,Rust,Macros,Metaprogramming,我试图解决一个代码重复的问题,使它不那么容易出错 我正在使用不同的数据源,每个数据源都有一些特定的属性。以下是我的数据模型的外观: mod sources { pub struct Ds1; pub struct Ds2; //hundreds more pub trait DsTypeTrait{ type Input; type Output; } impl DsTypeTrait for Ds1 {

我试图解决一个代码重复的问题,使它不那么容易出错

我正在使用不同的数据源,每个数据源都有一些特定的属性。以下是我的数据模型的外观:

mod sources {
    pub struct Ds1;
    pub struct Ds2;
    //hundreds more

    pub trait DsTypeTrait{
        type Input;
        type Output;
    }

    impl DsTypeTrait for Ds1 {
        type Input = u32;
        type Output = u32;
    }

    impl DsTypeTrait for Ds2 {
        type Input = String;
        type Output = String;
    }

    //etc...

    enum DataSource{
        Ds1(Ds1),
        Ds2(Ds2),
        //...
    }
}
因此,每当有人想要添加对新数据源的支持时,他们都需要将其添加到
enum数据源
。解决方案的问题是,如果另一个模块包含一些自定义数据格式,例如
数据源
通信,则需要在极易出错的两个位置添加数据源。例如:

mod some_other {
    use super::sources::*;

    struct DataSourceDataInputOutput<Ds: DsTypeTrait>{
        input: <Ds as DsTypeTrait>::Input,
        output: <Ds as DsTypeTrait>::Output
    }

    enum DataSourceIO{
        Ds1(DataSourceDataInputOutput<Ds1>),
        Ds2(DataSourceDataInputOutput<Ds2>)
        //Extremely easy to forget to add here
    }
}
mod some\u other{
使用super::sources::*;
结构数据源数据输入输出{
输入:::输入,
输出:::输出
}
枚举数据源{
Ds1(数据源数据输入输出),
Ds2(数据源数据输入输出)
//非常容易忘记在这里添加
}
}

问题:鉴于
枚举数据源
,是否可以编写一个宏来自动生成
枚举数据源
,并避免每次添加
新数据源
时手动修改
枚举数据源

枚举解析似乎是一个复杂的问题,因此移动是合理的数据源在宏本身中的实际声明。以下是我的想法:

#[macro_use]
mod sources {
    macro_rules! data_sources {
        ($name:ident, $type:tt) => {
            enum $name{
                Ds1($type<Ds1>),
                Ds2($type<Ds2>)
            }
        }
    }

    //...
}

mod some_other {

    struct DataSourceDataInputOutput<Ds: DsTypeTrait>{
        input: <Ds as DsTypeTrait>::Input,
        output: <Ds as DsTypeTrait>::Output
    }
    
    data_sources!(Test, DataSourceDataInputOutput);

    fn test_fn() {
        let ds1io: DataSourceDataInputOutput<Ds1> = DataSourceDataInputOutput{
            input: 1,
            output: 2
        };
        let test = DataSourceIO::Ds1(ds1io);  //works ok
    }

}
#[宏使用]
国防部来源{
宏规则!数据源{
($name:ident,$type:tt)=>{
枚举$name{
Ds1($type),
Ds2($type)
}
}
}
//...
}
修改一些其他的{
结构数据源数据输入输出{
输入:::输入,
输出:::输出
}
数据源!(测试、数据源数据输入输出);
fn测试_fn(){
让ds1io:DataSourceDataInputOutput=DataSourceDataInputOutput{
投入:1,
产出:2
};
让test=DataSourceIO::Ds1(ds1io);//正常工作
}
}