use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Hash, Default, Serialize, Deserialize)]
pub struct InstallProgress {
#[serde(default)]
pub bytes_downloaded: i64,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub total_bytes: Option<i64>,
#[serde(default)]
pub total_is_partial: bool,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub current_file: Option<String>,
}
impl InstallProgress {
pub fn fraction(&self) -> Option<f64> {
let total = self.total_bytes?;
if total <= 0 || self.total_is_partial {
return None;
}
Some((self.bytes_downloaded as f64 / total as f64).clamp(0.0, 1.0))
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum InstallEvent {
Queued,
Preparing,
Status(String),
Progress(InstallProgress),
Done,
Failed {
message: String,
},
Cancelled,
}
impl InstallEvent {
pub fn is_terminal(&self) -> bool {
matches!(
self,
InstallEvent::Done | InstallEvent::Failed { .. } | InstallEvent::Cancelled
)
}
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
pub enum InstallStreamEvent {
Status(String),
Progress(InstallProgress),
}