use std::io;
use tokio::io::{AsyncRead, AsyncReadExt};
use crate::observe::{Direction, SharedObserver};
pub const READ_CHUNK: usize = 8192;
pub(crate) fn bounded_prefix(text: &str, limit: Option<usize>) -> &str {
let mut end = limit.unwrap_or(text.len()).min(text.len());
while !text.is_char_boundary(end) {
end -= 1;
}
&text[..end]
}
pub fn drain_stderr<R>(
stderr: R,
observer: SharedObserver,
) -> tokio::task::JoinHandle<io::Result<()>>
where
R: AsyncRead + Unpin + Send + 'static,
{
tokio::spawn(async move {
let mut stderr = stderr;
let mut buffer = [0u8; READ_CHUNK];
loop {
let count = stderr.read(&mut buffer).await?;
if count == 0 {
return Ok(());
}
if let Some(observer) = observer.as_ref() {
observer.record("stderr", Direction::Stderr, &buffer[..count]);
}
}
})
}