use semver::Version;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
use std::path::PathBuf;
use super::release_ledger::{ReleaseLedger, ReleasePublishTarget};
#[derive(Clone, Debug)]
pub(crate) struct VersionObservation {
pub(crate) location: String,
pub(crate) version: Version,
}
#[derive(Clone, Debug)]
pub(crate) struct GitTagObservation {
pub(crate) version: Version,
pub(crate) raw_tags: Vec<String>,
}
#[derive(Clone, Debug)]
pub(crate) struct RegistryVersionObservation {
pub(crate) registry: String,
pub(crate) package_name: String,
pub(crate) source_file: String,
pub(crate) latest: Option<Version>,
pub(crate) raw_version: Option<String>,
pub(crate) published_at: Option<String>,
pub(crate) note: Option<String>,
}
#[derive(Clone, Debug)]
pub(crate) struct RegistryVersionDetails {
pub(crate) version: String,
pub(crate) published_at: Option<String>,
}
#[derive(Clone, Debug, Default)]
pub(crate) struct ChangedTargetSelection {
pub(crate) changed_files: Vec<String>,
pub(crate) version_targets: Vec<ResolvedRegistryPath>,
pub(crate) publish_targets: Vec<ReleasePublishTarget>,
pub(crate) baseline_source: String,
pub(crate) baseline_reference: Option<String>,
pub(crate) baseline_tag: Option<String>,
}
#[derive(Clone, Debug)]
pub(crate) struct ResolvedRegistryPath {
pub(crate) relative: String,
pub(crate) absolute: PathBuf,
pub(crate) cargo_package_override: Option<String>,
}
#[derive(Clone, Debug)]
pub(crate) struct WorkspacePrimaryCargoTarget {
pub(crate) manifest_relative: String,
pub(crate) manifest_absolute: PathBuf,
pub(crate) package_name: String,
}
#[derive(Default, Debug)]
pub(crate) struct VersionReport {
pub(crate) worktree: Vec<VersionObservation>,
pub(crate) head: Vec<VersionObservation>,
pub(crate) local_tags: Vec<GitTagObservation>,
pub(crate) remote_tags: Vec<GitTagObservation>,
pub(crate) registry_versions: Vec<RegistryVersionObservation>,
pub(crate) dirty_files: Vec<String>,
pub(crate) release_ledger: Option<ReleaseLedger>,
pub(crate) warnings: Vec<String>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub(crate) struct VersionChangeGuardRegistry {
#[serde(default)]
pub(crate) entries: BTreeMap<String, VersionChangeGuardEntry>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq, Eq)]
pub(crate) struct VersionChangeGuardEntry {
#[serde(default)]
pub(crate) pending_version_change_count: usize,
#[serde(default)]
pub(crate) head_commit: Option<String>,
}
#[derive(Clone, Debug, Default, PartialEq, Eq)]
pub(crate) struct GitWorktreeState {
pub(crate) is_dirty: bool,
pub(crate) head_commit: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ReleaseLatestPolicy {
True,
False,
Legacy,
}
impl ReleaseLatestPolicy {
pub(crate) fn as_github_api_value(self) -> &'static str {
match self {
Self::True => "true",
Self::False => "false",
Self::Legacy => "legacy",
}
}
}
#[derive(Debug, Clone)]
pub struct VersionReleaseOptions {
pub explicit_version: Option<String>,
pub release_flag: Option<String>,
pub allow_dirty: bool,
pub title: Option<String>,
pub notes: Option<String>,
pub notes_file: Option<PathBuf>,
pub draft: bool,
pub prerelease: bool,
pub publish: bool,
pub force: bool,
pub dry_run: bool,
pub latest_policy: ReleaseLatestPolicy,
}