use std::sync::Arc;
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum CheckOutcome {
UpToDate {
current: semver::Version,
},
Newer {
current: semver::Version,
latest: semver::Version,
release: rtb_vcs::Release,
},
Older {
current: semver::Version,
latest: semver::Version,
},
}
#[derive(Clone, Default)]
pub struct RunOptions {
pub force: bool,
pub target: Option<semver::Version>,
pub include_prereleases: bool,
pub progress: Option<ProgressSink>,
pub dry_run: bool,
}
impl std::fmt::Debug for RunOptions {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("RunOptions")
.field("force", &self.force)
.field("target", &self.target)
.field("include_prereleases", &self.include_prereleases)
.field("progress", &self.progress.as_ref().map(|_| "<callback>"))
.field("dry_run", &self.dry_run)
.finish()
}
}
#[derive(Debug, Clone, serde::Serialize)]
#[non_exhaustive]
pub struct RunOutcome {
#[serde(serialize_with = "serialize_version")]
pub from_version: semver::Version,
#[serde(serialize_with = "serialize_version")]
pub to_version: semver::Version,
pub bytes: u64,
pub swapped: bool,
pub staged_at: Option<std::path::PathBuf>,
}
fn serialize_version<S: serde::Serializer>(
v: &semver::Version,
s: S,
) -> std::result::Result<S::Ok, S::Error> {
s.collect_str(v)
}
#[derive(Debug, Clone)]
#[non_exhaustive]
pub enum ProgressEvent {
Checking,
Downloading {
bytes_done: u64,
bytes_total: u64,
},
Verifying,
SelfTesting,
Swapping,
Done {
version: semver::Version,
},
}
pub type ProgressSink = Arc<dyn Fn(ProgressEvent) + Send + Sync + 'static>;