Какой идиоматический способ конвертировать Result в пользовательский имп Fail? - PullRequest
0 голосов
/ 11 ноября 2018

В настоящее время я превращаю Result в экземпляр моего перечисления ошибок, который подразумевает Fail, например:

fn bbswitch_write(data: &str) -> Result<(), BbswitchError> {
    match fs::write("/proc/acpi/bbswitch", data) {
        Ok(_) => Ok(()),
        Err(e) => Err(BbswitchError::BbswitchNotAvailable { cause: e }.into()),
    }
}

, но это звучит очень многословно, и я бы не стал писатьоператор match в четыре строки каждый раз, когда я делаю что-то вроде этого:

let contents = fs::read_to_string("/proc/acpi/bbswitch").expect("bbswitch not available");

Есть ли что-то, что я делаю неправильно, что делает обработку ошибок неоправданно сложной, или способ, которым я мог бы сделать что-то лучше, чтобы сделатьэто удобнее?

Остальная часть моего кода выглядит примерно так:

#[macro_use]
extern crate failure;

use std::fs;
use std::process::exit;
use failure::Error;

#[derive(Debug, Fail)]
enum BbswitchError {
    #[fail(display = "bbswitch not available")]
    BbswitchNotAvailable {
        #[fail(cause)]
        cause: std::io::Error,
    },
}

fn bbswitch_write(data: &str) -> Result<(), Error> {
    match fs::write("/proc/acpi/bbswitch", data) {
        Ok(_) => Ok(()),
        Err(e) => Err(BbswitchError::BbswitchNotAvailable { cause: e }.into()),
    }
}

fn power_on() -> Result<(), Error> {
    bbswitch_write("ON")?;
    Ok(())
}

fn main() {
    match power_on() {
        Ok(_) => {},
        Err(_) => exit(1),
    }
}

1 Ответ

0 голосов
/ 11 ноября 2018

Это очень просто, просто используйте map_err():

fs::write("/proc/acpi/bbswitch", data)
    .map_err(|e| BbswitchError::BbswitchNotAvailable { cause: e }.into())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...