use crate::app::App;
use kanban_domain::Snapshot;
pub trait TuiSnapshot {
fn from_app(app: &App) -> Self;
fn apply_to_app(&self, app: &mut App) -> kanban_domain::KanbanResult<()>;
}
impl TuiSnapshot for Snapshot {
fn from_app(app: &App) -> Self {
app.ctx.snapshot().unwrap_or_default()
}
fn apply_to_app(&self, app: &mut App) -> kanban_domain::KanbanResult<()> {
app.ctx.apply_snapshot(self.clone())?;
if let Some(board_idx) = app.selection.active_board_index {
if let Some(board) = self.boards.get(board_idx) {
app.filter.current_sort_field = Some(board.task_sort_field);
app.filter.current_sort_order = Some(board.task_sort_order);
}
}
Ok(())
}
}
#[cfg(test)]
mod tests {
use super::*;
use kanban_domain::{Board, DependencyGraph, SortField};
#[test]
fn test_snapshot_serialization() {
use kanban_persistence::{snapshot_from_json_bytes, snapshot_to_json_bytes};
let snapshot = Snapshot {
boards: vec![],
columns: vec![],
cards: vec![],
archived_cards: vec![],
sprints: vec![],
graph: DependencyGraph::new(),
};
let bytes = snapshot_to_json_bytes(&snapshot).unwrap();
let restored = snapshot_from_json_bytes(&bytes).unwrap();
assert_eq!(restored.boards.len(), 0);
}
#[test]
fn test_apply_to_app_syncs_sort_field_from_board() {
let mut board = Board::new("Test", None::<String>);
board.update_task_sort(SortField::Position, kanban_domain::SortOrder::Ascending);
let snapshot = Snapshot {
boards: vec![board],
columns: vec![],
cards: vec![],
archived_cards: vec![],
sprints: vec![],
graph: DependencyGraph::new(),
};
let mut app = App::test_default();
app.selection.active_board_index = Some(0);
app.filter.current_sort_field = Some(SortField::Default);
snapshot.apply_to_app(&mut app).unwrap();
assert_eq!(
app.filter.current_sort_field,
Some(SortField::Position),
"apply_to_app should sync current_sort_field from active board"
);
}
}