fn result_from_option(a: Option, f: || -> E) -> Result { match a { Some(a) => Ok(a), _ => Err(f()) } } fn slurp_file(file: &Path) -> Result, SlurpError> { use std::{result, option}; let file: File = try!(File::open(file).map_err(|e| FailedIo(e))); let mut file = BufferedReader::new(file); let lines = file.lines() .skip(1) .map(|line| { let line = try!(line.map_err(|e| FailedIo(e))); let mut splits = line.as_slice().trim().split(',').map(|x| from_str(x)); // .and_then is flattening Option> to Option. let label: int = try!(result_from_option(splits.next().and_then(|x| x), || InvalidInput)); let pixels: Vec = try!(result_from_option(option::collect(splits), || InvalidInput)); Ok(LabelPixel { label: label, pixels: pixels }) }); result::collect(lines) }