use crate::Copier as AsyncCopier;
use crate::*;
pub struct Copier {
handle: tokio::runtime::Handle,
copier: Option<AsyncCopier>,
}
unsafe impl Sync for Copier {}
impl Copier {
pub(crate) fn new(handle: tokio::runtime::Handle, copier: AsyncCopier) -> Self {
Self {
handle,
copier: Some(copier),
}
}
pub fn abort(&mut self) -> Result<()> {
let Some(copier) = self.copier.as_mut() else {
return Ok(());
};
self.handle.block_on(copier.abort())
}
}
impl Iterator for Copier {
type Item = Result<usize>;
fn next(&mut self) -> Option<Self::Item> {
let copier = self.copier.as_mut()?;
match self.handle.block_on(copier.next()) {
Ok(Some(n)) => Some(Ok(n)),
Ok(None) => {
self.copier = None;
None
}
Err(err) => Some(Err(err)),
}
}
}
impl Drop for Copier {
fn drop(&mut self) {
if let Some(v) = self.copier.take() {
self.handle.block_on(async move { drop(v) });
}
}
}