use super::*;
impl<S> Output<S> {
pub fn buffer(&self) -> &str {
&self.buf
}
pub fn line(&self, idx: usize) -> Option<&str> {
use std::cmp::Ordering::*;
let lines_len = self.lines_pos.len();
let end = match idx.cmp(&lines_len) {
Less => self.lines_pos.get(idx).cloned(),
Equal => Some(self.buf.len()),
Greater => None,
};
end.map(|end| {
let start = if idx == 0 {
0
} else {
self.lines_pos.get(idx - 1).unwrap() + 1
};
&self.buf[start..end]
})
}
pub fn lines_len(&self) -> usize {
self.lines_pos.len() + 1
}
pub fn listen(&mut self) -> channel::Receiver<OutputChange> {
let (tx, rx) = channel::unbounded();
self.tx = Some(tx);
rx
}
pub fn close(&mut self) {
self.tx = None;
}
}
impl Default for Output<Read> {
fn default() -> Self {
Self::new()
}
}