多个默认值组合在一起



我正试图用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,
}

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

针对新约束进行更新

据我所知,我不知道有这样一个宏观。不过,我可以提供另一种解决方案。

#[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

最新更新