use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub struct PackageStatus {
pub current: Option<semver::Version>,
pub state: PackageState,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub enum PackageState {
Idle,
Checking,
UpToDate,
Downloading {
percent: u8,
},
Ready {
version: semver::Version,
},
Failed(String),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn the_state_round_trips_through_json() {
for state in [
PackageState::Idle,
PackageState::Downloading { percent: 40 },
PackageState::Ready {
version: semver::Version::new(1, 2, 3),
},
PackageState::Failed("offline".to_owned()),
] {
let status = PackageStatus {
current: Some(semver::Version::new(1, 0, 0)),
state,
};
let json = serde_json::to_string(&status).unwrap();
assert_eq!(
serde_json::from_str::<PackageStatus>(&json).unwrap(),
status
);
}
}
}