use dpm_model::{DependencyId, DependencyKind, Key, WorkItemId, WorkKind, WorkStatus};
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct Finding {
pub field: String,
pub detail: String,
}
impl Finding {
pub(crate) fn new(field: &str, detail: impl Into<String>) -> Self {
Self {
field: field.into(),
detail: detail.into(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct FieldChange {
pub field: String,
pub before: String,
pub after: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DependencyChange {
pub dependency: DependencyId,
pub relation: String,
pub field: String,
pub before: String,
pub after: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SourceSummary {
pub format: String,
pub project_guid: Option<String>,
pub name: Option<String>,
pub scope: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct WorkReference {
pub id: WorkItemId,
pub key: Key,
pub kind: WorkKind,
pub status: WorkStatus,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum ItemOutcome {
Created,
Updated,
Unchanged,
Skipped,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ItemReport {
pub uid: i64,
pub guid: Option<String>,
pub name: String,
pub outcome: ItemOutcome,
pub work: Option<WorkReference>,
pub preserved: Vec<String>,
pub approximated: Vec<Finding>,
pub rejected: Vec<Finding>,
pub kept: Vec<String>,
pub changes: Vec<FieldChange>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum LinkOutcome {
Preserved,
Changed,
Approximated,
Rejected,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LinkReport {
pub predecessor_uid: Option<i64>,
pub successor_uid: i64,
pub relation: Option<String>,
pub link_lag: i64,
pub lag_format: Option<u32>,
pub outcome: LinkOutcome,
pub notes: Vec<String>,
#[serde(default)]
pub changes: Vec<DependencyChange>,
pub dependencies: Vec<DependencyId>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct RemovedDependency {
pub id: DependencyId,
pub predecessor: Key,
pub successor: Key,
pub kind: DependencyKind,
pub lag_hours: f64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum CalendarOutcome {
Created,
Updated,
Unchanged,
BuiltIn,
Skipped,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct CalendarReport {
pub uid: i64,
pub name: String,
pub calendar: Option<String>,
pub outcome: CalendarOutcome,
pub approximated: Vec<Finding>,
pub rejected: Vec<Finding>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub affected_work: Vec<Key>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ImportReport {
pub source: SourceSummary,
pub target_project: Key,
pub items: Vec<ItemReport>,
pub links: Vec<LinkReport>,
pub removed_dependencies: Vec<RemovedDependency>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub calendars: Vec<CalendarReport>,
pub rejected: Vec<Finding>,
pub retained: Vec<Key>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ItemExportReport {
pub key: Key,
pub uid: u32,
pub guid: String,
pub preserved: Vec<String>,
pub approximated: Vec<Finding>,
pub omitted: Vec<Finding>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct DependencyExportReport {
pub id: DependencyId,
pub written: bool,
pub notes: Vec<String>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ExportReport {
pub project: Key,
pub project_guid: String,
pub items: Vec<ItemExportReport>,
pub dependencies: Vec<DependencyExportReport>,
pub omitted: Vec<Finding>,
}