如何链接返回结果并在失败的情况下返回的函数?

时间:2019-11-20 21:00:48

标签: error-handling rust match

有什么方法可以更简洁地表达以下代码?该函数仅在结果为Ok()时才能继续,否则应返回默认对象。我想出的代码看起来很简单,所以我想知道是否有更好,更简洁的方法。

fn get_config() -> Config {
    let cfg = match get_config_file_path() { // can return a (custom) PathError
        Ok(c) => c,
        Err(e) => {
            error(&*format!(
                "{} -> Using default configuration",
                e.description
            ));
            return Config::default();
        }
    };
    let cfg_str = match fs::read_to_string(&cfg) { // io::Error
        Ok(c) => c,
        Err(_) => {
            error("Failed to read config file");
            return Config::default();
        }
    };
    toml::from_str(&*cfg_str).unwrap_or_else(|_| { // toml::de::Error
        error("Failed to parse config file");
        Config::default()
    })
}

编辑:我的解决方案:

我创建了以下宏:

macro_rules! unwrap_or_return {
    ( $e:expr, $c:expr) => {
        match $e {
            Ok(x) => x,
            Err(_) => return $c,
        }
    };
}

fn get_config() -> Config {
    let cfg = unwrap_or_return!(get_config_file_path(), {
        error("Failed to get path to configuration file");
        Config::default()
    });
    let cfg_str = unwrap_or_return!(fs::read_to_string(&cfg), {
        error("Failed to read config file");
        Config::default()
    });
    toml::from_str(&*cfg_str).unwrap_or_else(|_| {
        error("Failed to parse config file");
        Config::default()
    })
}

0 个答案:

没有答案