use std::process::ChildStdout;
use std::io::{BufReader, BufRead};
use std::sync::mpsc::Sender;
use error::Result;
pub struct AsyncReader {
stdout: BufReader<ChildStdout>,
sender: Sender<Result<String>>,
}
impl AsyncReader {
pub fn new(stdout: ChildStdout, sender: Sender<Result<String>>) -> AsyncReader {
AsyncReader {
stdout: BufReader::new(stdout),
sender: sender,
}
}
pub fn read_loop(&mut self) {
loop {
let result = self.read();
match self.sender.send(result) {
Ok(_) => (),
Err(_) => break, }
}
}
fn read(&mut self) -> Result<String> {
let mut output = String::new();
loop {
self.stdout.read_line(&mut output)?;
if output.ends_with("\n\n") || output == "\n" || output.starts_with("@") {
break;
}
}
Ok(output)
}
}