Rust 锈菌和多态类型

Rust 锈菌和多态类型,rust,Rust,及 当config尝试进入时,它可以通过类型字段找到这些结构并将它们分配给正确的结构 我需要做什么才能让这一切发生 谢谢,因此,我不能100%确定您在这里想要实现什么,但是您可以使用serde将其序列化/反序列化为您想要的类型,并改用enum 例: 因此,根据所需的类型字段尝试进入返回S3StorageConfig,或LocalStorageConfig?然后您想从Config::new返回哪个?您在Serde文档中看过了吗?谢谢,这意味着我不能使用配置板条箱,但我想这很好? #[derive(

当config尝试进入时,它可以通过
类型
字段找到这些结构并将它们分配给正确的结构

我需要做什么才能让这一切发生


谢谢,

因此,我不能100%确定您在这里想要实现什么,但是您可以使用
serde
将其序列化/反序列化为您想要的类型,并改用
enum

例:


因此,根据所需的
类型
字段
尝试进入
返回
S3StorageConfig
,或
LocalStorageConfig
?然后您想从
Config::new
返回哪个?您在Serde文档中看过了吗?谢谢,这意味着我不能使用配置板条箱,但我想这很好?
#[derive(Debug, Deserialize)]
struct S3StorageConfig {
    url: String,
}

#[derive(Debug, Deserialize)]
struct LocalStorageConfig {
    root: std::path::PathBuf,
}

#[derive(Debug, Deserialize)]
struct StorageConfig {
    storage_type: String
}

#[derive(Debug, Deserialize)]
pub struct Config {
    storages: Vec<StorageConfig>
}

impl Config {
    pub fn new(path:Option<std::path::PathBuf>) -> Result<Self, config::ConfigError>  {
        let mut cfg = config::Config::default();

        if let Some(file_path) = path {
            cfg.merge(config::File::from(file_path)).unwrap();
        }

        cfg.merge(config::Environment::with_prefix("datastore"))?;


        cfg.try_into()
    }
}

[[storages]]
type: s3
url: ...
[[storages]]
type: local
root: ...
// This enum takes the place of your 'S3StorageConfig' and 'LocalStorageConfig'.
#[derive( Serialize, Deserialize, Debug )]
#[serde( tag = "type" )]
enum Storage {
    Cloud{ url: String },
    Local{ root: PathBuf },
}

fn main( ) {
    let vec = vec![ 
        Storage::Cloud{ url: "www.youtube.com".to_string( ) },
        Storage::Local{ root: PathBuf::from( "C:\\Windows\\Fonts" ) },
    ];

    let storage = serde_json::to_string( &vec ).unwrap( );

    let vec: Vec<Storage> = serde_json::from_str( &storage ).unwrap( );
    println!( "{:#?}", vec );
}
impl Config {
    pub fn new( ) -> Result<Storage, config::ConfigError> {
        // Read in the file here and use 'serde' to deserialize the
        // content of the file into the correct enum variant that you
        // can now return.
    }
}