Skip to main content

semifold_core/
changeset.rs

1use std::fmt;
2
3use semver::Version;
4use serde::Serialize;
5
6use crate::{PackageId, VersionSourceId};
7
8/// Stable identity of one changeset file without its storage location.
9#[derive(Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd, Serialize)]
10#[serde(transparent)]
11pub struct ChangesetId(String);
12
13impl ChangesetId {
14    #[must_use]
15    pub fn new(value: impl Into<String>) -> Self {
16        Self(value.into())
17    }
18
19    #[must_use]
20    pub fn as_str(&self) -> &str {
21        &self.0
22    }
23}
24
25impl fmt::Display for ChangesetId {
26    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
27        formatter.write_str(&self.0)
28    }
29}
30
31/// Semantic version change requested for one package.
32#[derive(Clone, Copy, Debug, Eq, Ord, PartialEq, PartialOrd, Serialize)]
33#[serde(rename_all = "lowercase")]
34pub enum BumpLevel {
35    Unchanged,
36    Patch,
37    Minor,
38    Major,
39}
40
41impl fmt::Display for BumpLevel {
42    fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
43        formatter.write_str(match self {
44            Self::Unchanged => "unchanged",
45            Self::Patch => "patch",
46            Self::Minor => "minor",
47            Self::Major => "major",
48        })
49    }
50}
51
52/// Why a package is included in a release.
53#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd, Serialize)]
54#[serde(tag = "kind", rename_all = "snake_case")]
55pub enum ReleaseReason {
56    Changeset {
57        changeset: ChangesetId,
58    },
59    DependencyPropagation {
60        dependency: PackageId,
61        next_version: Version,
62    },
63    SharedVersionPropagation {
64        source: VersionSourceId,
65    },
66}
67
68/// Non-fatal domain condition to render alongside a release plan.
69#[derive(Clone, Debug, Eq, Ord, PartialEq, PartialOrd, Serialize)]
70#[serde(tag = "kind", rename_all = "snake_case")]
71pub enum PlanWarning {
72    NonPatchBumpOnPrerelease {
73        package: PackageId,
74        requested: BumpLevel,
75    },
76}