//! Backup restore data-transfer types. //! //! The parsed-backup [`RestoreInput`] and the [`RestoreResult`] tally. The actual //! restore is performed transactionally by the storage backend //! (`goingson_db_sqlite::restore_all`) so the whole merge is one all-or-nothing unit //! and sub-collections are written verbatim; this module only defines the types that //! cross the command -> storage boundary. use crate::models::{ Attachment, DailyNote, Email, Event, Milestone, MonthlyGoal, MonthlyReflection, Project, SavedView, SyncAccount, Task, TimeSession, WeeklyReview, }; use crate::Contact; /// Result of a restore operation. #[derive(Debug, Default)] pub struct RestoreResult { /// Number of projects restored. pub projects_restored: usize, /// Number of tasks restored. pub tasks_restored: usize, /// Number of events restored. pub events_restored: usize, /// Number of emails restored. pub emails_restored: usize, /// Number of subtasks restored. pub subtasks_restored: usize, /// Number of status tokens restored. pub status_tokens_restored: usize, /// Number of annotations restored. pub annotations_restored: usize, /// Number of contacts restored. pub contacts_restored: usize, /// Number of time sessions restored. pub time_sessions_restored: usize, /// Number of milestones restored. pub milestones_restored: usize, /// Number of daily notes restored. pub daily_notes_restored: usize, /// Number of attachment records restored. pub attachments_restored: usize, /// Number of sync accounts restored. pub sync_accounts_restored: usize, /// Number of saved views restored. pub saved_views_restored: usize, /// Number of weekly reviews restored. pub weekly_reviews_restored: usize, /// Number of monthly goals restored. pub monthly_goals_restored: usize, /// Number of monthly reflections restored. pub monthly_reflections_restored: usize, } /// Pre-parsed backup data for restoration. pub struct RestoreInput { pub projects: Vec, pub tasks: Vec, pub events: Vec, pub emails: Vec, pub contacts: Vec, pub time_sessions: Vec, pub milestones: Vec, pub daily_notes: Vec, pub attachments: Vec, pub sync_accounts: Vec, pub saved_views: Vec, pub weekly_reviews: Vec, pub monthly_goals: Vec, pub monthly_reflections: Vec, } #[cfg(test)] mod tests { use super::*; #[test] fn restore_result_default_all_zeros() { let r = RestoreResult::default(); assert_eq!(r.projects_restored, 0); assert_eq!(r.tasks_restored, 0); assert_eq!(r.events_restored, 0); assert_eq!(r.emails_restored, 0); } #[test] fn restore_input_accepts_empty_vecs() { let input = RestoreInput { projects: vec![], tasks: vec![], events: vec![], emails: vec![], contacts: vec![], time_sessions: vec![], milestones: vec![], daily_notes: vec![], attachments: vec![], sync_accounts: vec![], saved_views: vec![], weekly_reviews: vec![], monthly_goals: vec![], monthly_reflections: vec![], }; assert!(input.projects.is_empty()); assert!(input.tasks.is_empty()); assert!(input.events.is_empty()); assert!(input.emails.is_empty()); assert!(input.contacts.is_empty()); assert!(input.time_sessions.is_empty()); assert!(input.milestones.is_empty()); assert!(input.daily_notes.is_empty()); assert!(input.attachments.is_empty()); assert!(input.sync_accounts.is_empty()); } }