rust - Serde 默认字段函数中的错误处理
问题描述
Serde 提供了一种为字段插入默认值的方法。这将调用一个与提供的默认名称相同的函数。例如:
#[derive(Deserialize, Debug)]
pub struct Config {
#[serde(default = "default_name")]
pub name: String,
}
fn default_name() -> String {
"unnamed"
}
这很好用。但是,我想使用文件所在目录的默认名称。这个版本default_name
看起来像这样:
fn default_name() -> Result<String, CustomError> {
// Get the name of this directory
let current_directory = env::current_dir()
.map_err(|e| CustomError::new(ErrorKind::IoError, "There was an io err"))?
.clean()
.to_str()
.unwrap();
Ok(current_directory.to_string())
}
(我省略了CustomError
andErrorKind
代码 - 你可以交换任何有效的此类代码。或者只是将其转换为字符串。)
但是,这不会编译,因为serde
期望一个函数签名返回值的类型(在本例中为 a String
),而不是Result
对象。有没有办法serde
传播这里出现的错误?我可以做很多事情来消除错误,例如将字段更改为一个选项或只是传回一个硬编码的默认值,但我必须假设提供一个函数来调用没有什么意义对于默认值,除非函数可能以某种方式失败。处理这个问题的惯用方法是什么?
(需要明确的是,在这种情况下,我希望程序将错误交还给试图解析配置文件以进行干净管理的代码。恐慌并不是一个真正的选择。)
解决方案
推荐阅读
- javascript - Luxon 无法解析此日期格式
- android - 尝试插入时没有此类列的 SQLite 问题
- c++ - 如何在 C++ 中使用多个缓存层(RAM、HDD、冷)
- macos - 尝试在 Mac 上安装 create-react-app 失败
- c - 试图根据用户输入制作马里奥金字塔。但是,如果遇到 get int 问题,我可以得到帮助吗?
- linux - NeoVim 需要两秒钟才能通过 ctrl + q 键绑定退出
- c# - 'T' 类型的表达式不能由 ' 类型的模式处理
' - kubernetes - 使用 InfluxDB 使用自定义指标进行水平 Pod 自动缩放
- android - 有没有办法在没有实际应用的情况下生成应用内购买收据?
- facebook - 如何将 Facebook 帐户附加到 AWS Cognito 用户