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(err.into())),
None => return None,
};
match parse::parse_line(line) {
Ok(Some(result)) => return Some(Ok(result)),
Ok(None) => {}
Err(err) => return Some(Err(err.into())),
}
}
}
}