首页 > 解决方案 > 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())
}

(我省略了CustomErrorandErrorKind代码 - 你可以交换任何有效的此类代码。或者只是将其转换为字符串。)

但是,这不会编译,因为serde期望一个函数签名返回值的类型(在本例中为 a String),而不是Result对象。有没有办法serde传播这里出现的错误?我可以做很多事情来消除错误,例如将字段更改为一个选项或只是传回一个硬编码的默认值,但我必须假设提供一个函数来调用没有什么意义对于默认值,除非函数可能以某种方式失败。处理这个问题的惯用方法是什么?

(需要明确的是,在这种情况下,我希望程序将错误交还给试图解析配置文件以进行干净管理的代码。恐慌并不是一个真正的选择。)

标签: rustserde

解决方案


推荐阅读