use std::io;
use ::shmipc::stream::Stream;
#[derive(Default)]
pub struct ShmipcHelper {
inner: Option<Box<Stream>>,
}
impl ShmipcHelper {
pub const fn none() -> Self {
Self { inner: None }
}
pub const fn new(inner: Box<Stream>) -> Self {
Self { inner: Some(inner) }
}
pub const fn available(&self) -> bool {
self.inner.is_some()
}
pub async fn close(&mut self) -> io::Result<()> {
if let Some(s) = &mut self.inner {
s.close().await.map_err(Into::into)
} else {
Ok(())
}
}
pub async fn reuse(&self) {
if let Some(s) = &self.inner {
s.reuse().await
}
}
pub fn release_read_and_reuse(&self) {
if let Some(s) = &self.inner {
s.release_read_and_reuse();
}
}
pub fn close_guard(&self) -> ShmipcCloseGuard {
ShmipcCloseGuard {
inner: self.inner.clone(),
}
}
}
pub struct ShmipcCloseGuard {
inner: Option<Box<Stream>>,
}
impl Drop for ShmipcCloseGuard {
fn drop(&mut self) {
if let Some(mut stream) = self.inner.take() {
tokio::spawn(async move {
let _ = stream.close().await;
});
}
}
}