Skip to main content

callisto_graph/
plan.rs

1use std::collections::BTreeMap;
2use std::path::PathBuf;
3
4use callisto_changelog::ChangelogInput;
5use callisto_format::PreState;
6use callisto_model::{
7    BumpReason, BumpRecord, CommitSha, ConfigKey, Diagnostic, LockfileRefreshResult, PackageId, Severity, Version,
8    VersionReport, SCHEMA_VERSION,
9};
10
11use crate::cascade::SpecRewrite;
12
13#[derive(Clone, Debug, Default)]
14pub struct VersionPlan {
15    pub bumps: Vec<PlannedBump>,
16    pub rewrites: Vec<SpecRewrite>,
17    pub platform_writes: Vec<PlatformWrite>,
18    pub optional_dep_updates: Vec<OptionalDepUpdate>,
19    pub changelog_writes: Vec<ChangelogWrite>,
20    pub consumed_changesets: Vec<PathBuf>,
21    pub pre_state_update: Option<PreState>,
22    pub delete_pre_json: Option<PathBuf>,
23    pub pre_cursor_updates: Vec<(PackageId, CommitSha)>,
24    pub observed_versions: BTreeMap<PackageId, Version>,
25    pub diagnostics: Vec<Diagnostic>,
26}
27
28#[derive(Clone, Debug, PartialEq, Eq)]
29pub struct PlannedBump {
30    pub package: PackageId,
31    pub from: Version,
32    pub to: Version,
33    pub severity: Severity,
34    pub governed_by: Option<ConfigKey>,
35    pub reason: Option<BumpReason>,
36    pub writes: Vec<VersionWriteTarget>,
37}
38
39#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
40pub enum VersionWriteTarget {
41    Manifest(PathBuf),
42    CargoWorkspacePackage { root_manifest: PathBuf },
43}
44
45#[derive(Clone, Debug, PartialEq, Eq)]
46pub struct PlatformWrite {
47    pub manifest: PathBuf,
48    pub version: Version,
49    pub from: Version,
50}
51
52#[derive(Clone, Debug, PartialEq, Eq)]
53pub struct OptionalDepUpdate {
54    pub manifest: PathBuf,
55    pub updates: Vec<(String, Version)>,
56}
57
58#[derive(Clone, Debug, PartialEq, Eq)]
59pub struct ChangelogWrite {
60    pub changelog_path: PathBuf,
61    pub input: ChangelogInput,
62}
63
64impl VersionPlan {
65    pub fn to_report(&self, lockfiles: Option<Vec<LockfileRefreshResult>>) -> VersionReport {
66        let mut bumps = Vec::new();
67        for b in &self.bumps {
68            bumps.push(BumpRecord {
69                package: b.package.clone(),
70                from: b.from.clone(),
71                to: b.to.clone(),
72                severity: b.severity,
73                governed_by: b.governed_by.clone(),
74                reason: b.reason.clone(),
75            });
76        }
77
78        VersionReport {
79            schema_version: SCHEMA_VERSION,
80            bumps,
81            lockfile_refresh_results: lockfiles,
82            diagnostics: self.diagnostics.clone(),
83        }
84    }
85}
86
87#[cfg(test)]
88mod platform_write_from_field_tests {
89    use super::*;
90    use callisto_model::VersionGrammar;
91
92    #[test]
93    fn platform_write_carries_from_field_distinct_from_version() {
94        let pw = PlatformWrite {
95            manifest: PathBuf::from("platform/package.json"),
96            version: Version::parse("1.1.0", VersionGrammar::SemVer).unwrap(),
97            from: Version::parse("1.0.0", VersionGrammar::SemVer).unwrap(),
98        };
99        assert_eq!(pw.from.render(), "1.0.0");
100        assert_eq!(pw.version.render(), "1.1.0");
101    }
102}