use serde::{Deserialize, Serialize};
use crate::model::names::{
MacroName, ModuleName, ProjectName, RecordName, RelativePath, SeriesName, TagName,
};
use crate::model::snapshot::{FunArity, TypeArity};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct DiffPayload {
pub project: ProjectName,
pub from: TagName,
pub to: TagName,
pub modules_added: Vec<ModuleName>,
pub modules_removed: Vec<ModuleName>,
pub exports_added: Vec<QualifiedFunArity>,
pub exports_removed: Vec<QualifiedFunArity>,
pub types_added: Vec<QualifiedTypeArity>,
pub types_removed: Vec<QualifiedTypeArity>,
pub callbacks_added: Vec<QualifiedFunArity>,
pub callbacks_removed: Vec<QualifiedFunArity>,
pub headers_added: Vec<RelativePath>,
pub headers_removed: Vec<RelativePath>,
pub records_added: Vec<QualifiedRecord>,
pub records_removed: Vec<QualifiedRecord>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub versioned_machine_version_changes: Vec<VersionedMachineVersionChange>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub wire_constant_changes: Vec<WireConstantChange>,
}
impl DiffPayload {
#[must_use]
pub fn is_empty(&self) -> bool {
self.modules_added.is_empty()
&& self.modules_removed.is_empty()
&& self.exports_added.is_empty()
&& self.exports_removed.is_empty()
&& self.types_added.is_empty()
&& self.types_removed.is_empty()
&& self.callbacks_added.is_empty()
&& self.callbacks_removed.is_empty()
&& self.headers_added.is_empty()
&& self.headers_removed.is_empty()
&& self.records_added.is_empty()
&& self.records_removed.is_empty()
&& self.versioned_machine_version_changes.is_empty()
&& self.wire_constant_changes.is_empty()
}
#[must_use]
pub fn breaking_removal_count(&self) -> usize {
self.modules_removed.len()
+ self.exports_removed.len()
+ self.callbacks_removed.len()
+ self.types_removed.len()
+ self.records_removed.len()
+ self.headers_removed.len()
}
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case", tag = "kind")]
pub enum VersionedMachineVersionChange {
Missing {
module: ModuleName,
side: String,
},
Drift {
module: ModuleName,
from: Option<u64>,
to: Option<u64>,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case", tag = "kind")]
pub enum WireConstantChange {
Missing {
module: ModuleName,
side: String,
macros: Vec<MacroName>,
},
Drift {
module: ModuleName,
macro_name: MacroName,
from: String,
to: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct QualifiedFunArity {
pub module: ModuleName,
#[serde(with = "crate::model::serde_util::display_from_str")]
pub fun_arity: FunArity,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct QualifiedTypeArity {
pub module: ModuleName,
#[serde(with = "crate::model::serde_util::display_from_str")]
pub type_arity: TypeArity,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct QualifiedRecord {
pub header: RelativePath,
pub record: RecordName,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct CrossSeriesDiffPayload {
pub from_series: SeriesName,
pub to_series: SeriesName,
pub projects: Vec<DiffPayload>,
}