use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ChangesSummary {
pub total_packages: usize,
pub packages_with_changes: usize,
pub packages_without_changes: usize,
pub total_files_changed: usize,
pub total_commits: usize,
pub total_lines_added: usize,
pub total_lines_deleted: usize,
}
impl ChangesSummary {
#[must_use]
pub fn new() -> Self {
Self {
total_packages: 0,
packages_with_changes: 0,
packages_without_changes: 0,
total_files_changed: 0,
total_commits: 0,
total_lines_added: 0,
total_lines_deleted: 0,
}
}
#[must_use]
pub fn has_changes(&self) -> bool {
self.packages_with_changes > 0 || self.total_files_changed > 0
}
#[must_use]
pub fn change_percentage(&self) -> f64 {
if self.total_packages == 0 {
0.0
} else {
(self.packages_with_changes as f64 / self.total_packages as f64) * 100.0
}
}
#[must_use]
pub fn net_lines_changed(&self) -> i64 {
self.total_lines_added as i64 - self.total_lines_deleted as i64
}
#[must_use]
pub fn total_lines_changed(&self) -> usize {
self.total_lines_added + self.total_lines_deleted
}
#[must_use]
pub fn average_files_per_package(&self) -> f64 {
if self.packages_with_changes == 0 {
0.0
} else {
self.total_files_changed as f64 / self.packages_with_changes as f64
}
}
}
impl Default for ChangesSummary {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct PackageChangeStats {
pub files_changed: usize,
pub files_added: usize,
pub files_modified: usize,
pub files_deleted: usize,
pub commits: usize,
pub lines_added: usize,
pub lines_deleted: usize,
}
impl PackageChangeStats {
#[must_use]
pub fn new() -> Self {
Self {
files_changed: 0,
files_added: 0,
files_modified: 0,
files_deleted: 0,
commits: 0,
lines_added: 0,
lines_deleted: 0,
}
}
#[must_use]
pub fn has_changes(&self) -> bool {
self.files_changed > 0
}
#[must_use]
pub fn net_lines_changed(&self) -> i64 {
self.lines_added as i64 - self.lines_deleted as i64
}
#[must_use]
pub fn total_lines_changed(&self) -> usize {
self.lines_added + self.lines_deleted
}
#[must_use]
pub fn average_lines_per_file(&self) -> f64 {
if self.files_changed == 0 {
0.0
} else {
self.total_lines_changed() as f64 / self.files_changed as f64
}
}
#[must_use]
pub fn added_percentage(&self) -> f64 {
if self.files_changed == 0 {
0.0
} else {
(self.files_added as f64 / self.files_changed as f64) * 100.0
}
}
#[must_use]
pub fn modified_percentage(&self) -> f64 {
if self.files_changed == 0 {
0.0
} else {
(self.files_modified as f64 / self.files_changed as f64) * 100.0
}
}
#[must_use]
pub fn deleted_percentage(&self) -> f64 {
if self.files_changed == 0 {
0.0
} else {
(self.files_deleted as f64 / self.files_changed as f64) * 100.0
}
}
}
impl Default for PackageChangeStats {
fn default() -> Self {
Self::new()
}
}