1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
use std::io::prelude::*; use std::io::{BufReader, Lines}; use std::env; use errors::*; use parse; pub struct Iter<R> { lines: Lines<BufReader<R>>, } impl<R: Read> Iter<R> { pub fn new(reader: R) -> Iter<R> { Iter { lines: BufReader::new(reader).lines(), } } pub fn load(self) -> Result<()> { for item in self { let (key, value) = item?; if env::var(&key).is_err() { env::set_var(&key, value); } } Ok(()) } } impl<R: Read> Iterator for Iter<R> { type Item = Result<(String, String)>; fn next(&mut self) -> Option<Self::Item> { loop { let line = match self.lines.next() { Some(Ok(line)) => line, Some(Err(err)) => return Some(Err(Error::Io(err))), None => return None, }; match parse::parse_line(&line) { Ok(Some(result)) => return Some(Ok(result)), Ok(None) => {} Err(err) => return Some(Err(err)), } } } }