#![warn(missing_docs)]
#![warn(clippy::pedantic)]
mod limit;
mod pool;
mod rot;
pub use limit::Limiting;
pub use pool::{Error, Pool};
pub use rot::Rotating;
use std::io::{BufRead, Write};
pub fn xstream(
pool: &mut impl Pool,
in_handle: &mut impl BufRead,
delim: impl AsRef<[u8]>,
write_delim: &Option<impl AsRef<[u8]>>,
) -> Result<(), Error> {
let delim = delim.as_ref();
while !in_handle.fill_buf().map_err(Error::Input)?.is_empty() {
let proc = pool.get()?;
let out_handle = proc.stdin.as_mut().ok_or(Error::StdinNotPiped)?;
while {
let buf = in_handle.fill_buf().map_err(Error::Input)?;
let (consume, hit_delim) = match buf.windows(delim.len()).position(|w| w == delim) {
None => (
if buf.len() < delim.len() {
buf.len()
} else {
buf.len() - delim.len() + 1
},
false,
),
Some(pos) => (pos + delim.len(), true),
};
if let (Some(wdel), true) = (write_delim, hit_delim) {
out_handle
.write_all(&buf[..consume - delim.len()])
.map_err(Error::Output)?;
out_handle.write_all(wdel.as_ref()).map_err(Error::Output)?;
} else {
out_handle
.write_all(&buf[..consume])
.map_err(Error::Output)?;
}
in_handle.consume(consume);
!hit_delim && consume > 0
} {}
}
pool.join()
}