use std::fmt;
use std::path::PathBuf;
use std::sync::Arc;
use xet_data::processing::{FileDownloadSession, XetFileInfo};
use xet_data::progress_tracking::{ItemProgressReport, UniqueID};
use super::task_runtime::{BackgroundTaskState, TaskRuntime, XetTaskState};
use crate::error::XetError;
#[derive(Clone, Debug)]
pub struct XetDownloadReport {
pub task_id: UniqueID,
pub path: Option<PathBuf>,
pub file_info: XetFileInfo,
pub progress: Option<ItemProgressReport>,
}
pub(super) struct XetFileDownloadInner {
pub(super) task_id: UniqueID,
pub(super) dest_path: PathBuf,
pub(super) download_session: Arc<FileDownloadSession>,
pub(super) state: tokio::sync::Mutex<BackgroundTaskState<XetDownloadReport>>,
}
pub struct XetFileDownload {
pub(super) inner: Arc<XetFileDownloadInner>,
pub(super) task_runtime: Arc<TaskRuntime>,
}
impl XetFileDownload {
pub fn task_id(&self) -> UniqueID {
self.inner.task_id
}
pub fn file_path(&self) -> PathBuf {
self.inner.dest_path.clone()
}
pub fn progress(&self) -> Option<ItemProgressReport> {
self.inner.download_session.item_report(self.inner.task_id)
}
pub fn status(&self) -> Result<XetTaskState, XetError> {
self.task_runtime.status_from_background_task(&self.inner.state)
}
pub fn result(&self) -> Option<Result<XetDownloadReport, XetError>> {
self.task_runtime.background_result(&self.inner.state)
}
pub async fn finish(&self) -> Result<XetDownloadReport, XetError> {
let inner = self.inner.clone();
self.task_runtime
.bridge_async_finalizing("download_finish", true, async move { inner.state.lock().await.finish().await })
.await
}
pub fn finish_blocking(&self) -> Result<XetDownloadReport, XetError> {
let inner = self.inner.clone();
self.task_runtime
.bridge_sync_finalizing("download_finish", true, async move { inner.state.lock().await.finish().await })
}
pub fn cancel(&self) {
self.task_runtime.cancel_background_task();
}
}
impl fmt::Debug for XetFileDownload {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("XetFileDownload")
.field("task_id", &self.inner.task_id)
.finish_non_exhaustive()
}
}