1 unstable release

Uses old Rust 2015

0.1.0 May 15, 2017

#69 in #results

41 downloads per month

MIT/Apache

7KB
85 lines

Tools for dealing with tricky error handling situations

This crate provides the ResultIterExt trait, which provides conveniences for converting collections of Result<T> types to collections of T, while handling errors correctly.

The basic way to use this library is to call fail_fast_if_err()? on any Iterator of Result, to "unwrap" all the individual elements, returning the first error encountered.

Note that although this method chains off an iterator, and produces a new iterator, it drains he former iterator before returning, and requires temporary storage proportional to the elements returned by the original iterator.

Examples

Read a directory of files to String, stopping at the first error and returning it if necessary.

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();
}

Read a directory of files to String, continuing after the first error, and returning all errors.

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();
}

No runtime deps