use crate::types::DependencyType;
use crate::upgrade::registry::UpgradeType;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpgradeResult {
pub dry_run: bool,
pub applied: Vec<AppliedUpgrade>,
pub modified_files: Vec<PathBuf>,
pub backup_path: Option<PathBuf>,
pub changeset_id: Option<String>,
pub summary: ApplySummary,
}
impl UpgradeResult {
#[must_use]
pub fn dry_run(applied: Vec<AppliedUpgrade>, summary: ApplySummary) -> Self {
Self {
dry_run: true,
applied,
modified_files: Vec::new(),
backup_path: None,
changeset_id: None,
summary,
}
}
#[must_use]
pub fn applied(
applied: Vec<AppliedUpgrade>,
modified_files: Vec<PathBuf>,
backup_path: Option<PathBuf>,
changeset_id: Option<String>,
summary: ApplySummary,
) -> Self {
Self { dry_run: false, applied, modified_files, backup_path, changeset_id, summary }
}
#[must_use]
pub fn has_changes(&self) -> bool {
!self.applied.is_empty()
}
#[must_use]
pub fn packages_modified(&self) -> usize {
self.summary.packages_modified
}
#[must_use]
pub fn dependencies_upgraded(&self) -> usize {
self.summary.dependencies_upgraded
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppliedUpgrade {
pub package_path: PathBuf,
pub dependency_name: String,
pub dependency_type: DependencyType,
pub old_version: String,
pub new_version: String,
pub upgrade_type: UpgradeType,
}
impl AppliedUpgrade {
#[must_use]
pub fn is_patch(&self) -> bool {
self.upgrade_type == UpgradeType::Patch
}
#[must_use]
pub fn is_minor(&self) -> bool {
self.upgrade_type == UpgradeType::Minor
}
#[must_use]
pub fn is_major(&self) -> bool {
self.upgrade_type == UpgradeType::Major
}
#[must_use]
pub fn is_breaking(&self) -> bool {
self.is_major()
}
#[must_use]
pub fn version_change(&self) -> String {
format!("{} → {}", self.old_version, self.new_version)
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ApplySummary {
pub packages_modified: usize,
pub dependencies_upgraded: usize,
pub direct_updates: usize,
pub propagated_updates: usize,
pub dependency_updates: usize,
pub major_upgrades: usize,
pub minor_upgrades: usize,
pub patch_upgrades: usize,
pub applied_at: DateTime<Utc>,
}
impl ApplySummary {
#[must_use]
pub fn new() -> Self {
Self {
packages_modified: 0,
dependencies_upgraded: 0,
direct_updates: 0,
propagated_updates: 0,
dependency_updates: 0,
major_upgrades: 0,
minor_upgrades: 0,
patch_upgrades: 0,
applied_at: Utc::now(),
}
}
#[must_use]
pub fn total_upgrades(&self) -> usize {
self.major_upgrades + self.minor_upgrades + self.patch_upgrades
}
#[must_use]
pub fn has_major_upgrades(&self) -> bool {
self.major_upgrades > 0
}
#[must_use]
pub fn has_changes(&self) -> bool {
self.dependencies_upgraded > 0
}
}
impl Default for ApplySummary {
fn default() -> Self {
Self::new()
}
}