use o3::buffer::{pool, pool::owners, storage};
use std::mem;
use crate::{error, state::buffers};
pub(crate) struct Output<'d> {
pub(crate) chunk: Option<storage::Shared<owners::Edge<owners::Plain, pool::Borrowed<'d>>>>,
pub(crate) control: Result<(), crate::Error>,
pub(crate) released: buffers::Release,
}
pub(super) enum Staged<'d> {
Ready(buffers::Reserve<'d>),
Retained(storage::Shared<owners::Edge<owners::Plain, pool::Borrowed<'d>>>),
Released,
}
impl<'d> Staged<'d> {
pub(super) fn copy(&mut self, plain: &[u8]) -> Result<(), error::Error> {
let recv = match mem::replace(self, Self::Released) {
Self::Ready(recv) => recv,
state => {
*self = state;
return Err(error::Error::InvalidBufferProgress);
}
};
*self = Self::Retained(recv.copy(plain)?);
Ok(())
}
}