1use std::num::NonZeroUsize;
2
3use crate::Version;
4
5#[derive(Debug, Eq, PartialEq)]
6pub struct Diff {
7 pub name: String,
8 pub versions: Vec<VersionDiff>,
9 pub status: DiffStatus,
10 pub has_omitted_versions: bool,
11}
12
13#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
14pub struct VersionAmount {
15 pub version: Version,
16 pub amount: NonZeroUsize,
17}
18
19impl VersionAmount {
20 #[must_use]
21 pub fn new(version: impl Into<Version>, amount: NonZeroUsize) -> Self {
22 Self {
23 version: version.into(),
24 amount,
25 }
26 }
27
28 #[must_use]
29 pub fn try_new(version: impl Into<Version>, amount: usize) -> Option<Self> {
30 Some(Self::new(version, NonZeroUsize::new(amount)?))
31 }
32}
33
34#[derive(Debug, Clone, Eq, PartialEq, Ord, PartialOrd)]
35pub enum VersionDiff {
36 Removed(VersionAmount),
37 Added(VersionAmount),
38 Changed {
39 old: VersionAmount,
40 new: VersionAmount,
41 },
42 AmountChanged {
43 version: Version,
44 old_amount: NonZeroUsize,
45 new_amount: NonZeroUsize,
46 },
47}
48
49#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
50pub enum DiffStatus {
51 Changed,
52 Mixed,
53 Upgraded,
54 Downgraded,
55 Added,
56 Removed,
57}