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,
8    Severity, Version, 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: bool,
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}
50
51#[derive(Clone, Debug, PartialEq, Eq)]
52pub struct OptionalDepUpdate {
53    pub manifest: PathBuf,
54    pub updates: Vec<(String, Version)>,
55}
56
57#[derive(Clone, Debug, PartialEq, Eq)]
58pub struct ChangelogWrite {
59    pub changelog_path: PathBuf,
60    pub input: ChangelogInput,
61}
62
63impl VersionPlan {
64    pub fn to_report(&self, lockfiles: Option<Vec<LockfileRefreshResult>>) -> VersionReport {
65        let mut bumps = Vec::new();
66        for b in &self.bumps {
67            bumps.push(BumpRecord {
68                package: b.package.clone(),
69                from: b.from.clone(),
70                to: b.to.clone(),
71                severity: b.severity,
72                governed_by: b.governed_by.clone(),
73                reason: b.reason.clone(),
74            });
75        }
76
77        VersionReport {
78            schema_version: SCHEMA_VERSION,
79            bumps,
80            lockfile_refresh_results: lockfiles,
81            diagnostics: self.diagnostics.clone(),
82        }
83    }
84}