1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2017 年 5 月 15 日

#io-error 中排名 52

每月下载量 41

MIT/Apache 许可

7KB
85 行(不含注释)

处理棘手错误处理情况的工具

此crate提供ResultIterExt trait,该trait提供将Result<T>类型的集合转换为T类型的集合的便利性,同时正确处理错误。

使用此库的基本方法是在任何Result迭代器上调用fail_fast_if_err()?,以“解包”所有单个元素,返回遇到的第一个错误。

请注意,尽管此方法从迭代器中链式调用,并产生一个新的迭代器,但在返回之前会清空前一个迭代器,并且需要与原始迭代器返回的元素成比例的临时存储。

示例

将文件目录读取为String,在第一个错误处停止,并在必要时返回它。

extern crate result_iter;

use result_iter::ResultIterExt;
use std::io::{self, Read, BufReader};
use std::fs::{self, File};

fn run() -> Result<Vec<String>, io::Error> {
    // Read a directory of files into a Vec, where each
    // file my generate an error
    let maybe_strings;
    maybe_strings = fs::read_dir(".")?
        .map(|dirent| {
            dirent.and_then(|d| File::open(d.path()))
                .and_then(|f| {
                    let mut f = BufReader::new(f);
                    let mut s = String::new();
                    f.read_to_string(&mut s)?;
            Ok(s)})
        });

    // As soon as we encounter an error, return it.
    // Otherwise return a Vec<String>
    let strings = maybe_strings.fail_fast_if_err()?.collect();
    Ok(strings)
}

fn main() {
    let _ = run();
}

将文件目录读取为String,在第一个错误后继续,并返回所有错误。

extern crate result_iter;

use result_iter::{ResultIterExt, MultiError};
use std::io::{self, Read, BufReader};
use std::fs::{self, File};

fn run() -> Result<Vec<String>, MultiError<io::Error>> {
    // Read a directory of files into a Vec, where each
    // file my generate an error
    let maybe_strings;
    maybe_strings = fs::read_dir(".")
        // Map io::Error to MultiError<io::Error> to satisfy
        // the example return type.
        .map_err(|e| MultiError::new(vec![e]))?
        .map(|dirent| {
            dirent.and_then(|d| File::open(d.path()))
                .and_then(|f| {
                    let mut f = BufReader::new(f);
                    let mut s = String::new();
                    f.read_to_string(&mut s)?;
            Ok(s)})
        });

    let maybe_strings = maybe_strings.collect::<Vec<_>>();
    let maybe_strings = maybe_strings.into_iter();

    // As soon as we encounter an error, return it.
    // Otherwise return a Vec<String>
    let strings = maybe_strings.fail_slow_if_err()?.collect();
    Ok(strings)
}

fn main() {
    let _ = run();
}

无运行时依赖