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}