首页 > 解决方案 > serde - 多个默认值组合在一起?

问题描述

我正在尝试使用 Serde 加载 Toml 文件,它包含多个布尔值,如果在文本文件中找不到,我想将它们全部默认为 false。

我目前的实现是:

#[derive(serde::Deserialize, serde::Serialize)]
#[serde(rename_all="PascalCase")]
pub struct SomeConfigStruct {
     // This one *must* exist, non optional, non defaulted.
    class_name : String, 

    #[serde(default = "default_boolean")]
    parent_in_constructor : bool,

    #[serde(default = "default_boolean")]
    set_user_texts : bool,

    #[serde(default = "default_boolean")]
    singleton : bool, 

    #[serde(default = "default_boolean")]
    use_enum_types : bool,
}

我怎样才能做一些事情:

#[derive(serde::Deserialize, serde::Serialize)]
#[serde(rename_all="PascalCase")]
pub struct SomeConfigStruct {
    class_name : String,

    #[serde(type = bool, default = "default_boolean")]
    parent_in_constructor : bool,
    set_user_texts : bool,
    singleton : bool, 
    use_enum_types : bool,
}

[编辑,结构上的新成员,以更好地说明我的需要。]

标签: rustserde

解决方案


更新了新的约束

我不知道这样的宏,据我所知不存在。不过,我可以提供替代解决方案。

#[derive(serde::Deserialize, serde::Serialize)]
#[serde(rename_all = "PascalCase")]
pub struct SomeConfigStruct {
    class_name: String,

    #[serde(default)]
    #[serde(flatten)]
    defaulting_values: SomeConfigStructDefaulting,
}

#[derive(serde::Deserialize, serde::Serialize)]
#[serde(default)]
pub struct SomeConfigStructDefaulting {
    parent_in_constructor: bool,
    set_user_texts: bool,
    singleton: bool,
    use_enum_types: bool,
}

// This will be called to fill in missing spots in defaulting_values.
// Will also be called, if defaulting_values is missing altogether.
impl Default for SomeConfigStructDefaulting {
    fn default() -> Self {
        let default_boolean = true;
        Self {
            parent_in_constructor: default_boolean,
            set_user_texts: default_boolean,
            singleton: default_boolean,
            use_enum_types: default_boolean,
        }
    }
}

这肯定不会减少行数,但它确实会固定default_boolean为一个值,如果这是您的主要关注点的话。

这样,您的序列化表示看起来仍然相同,并且您可以轻松编写包装器而不必编写some_config_struct.defaulting_values实际代码。


推荐阅读