diff --git a/pttodoest/src/main.rs b/pttodoest/src/main.rs index c51042a..9233663 100755 --- a/pttodoest/src/main.rs +++ b/pttodoest/src/main.rs @@ -100,17 +100,23 @@ impl File { Events::new(&self.file) } - fn reconcile_snapshot_changes(&self) -> Result<(), String> { - let snapshot = self.events()?.snapshot()?; - let snapshot = serde_json::to_string(&snapshot).unwrap(); + fn stash_staged_changes(&self, stashed: Vec) -> Result<(), String> { + let snapshot = serde_json::to_string(&stashed).unwrap(); let snapshot: serde_json::Value = serde_json::from_str(snapshot.as_str()).unwrap(); let stage = self.snapshot()?; let stage = serde_json::to_string(&stage).unwrap(); let stage: serde_json::Value = serde_json::from_str(stage.as_str()).unwrap(); - let patch = json_patch::diff(&snapshot, &stage); - panic!("not impl jsondiff snapshots: {:?}", patch) + let patches = json_patch::diff(&snapshot, &stage); + let deltas: Vec = patches.iter() + .map(|patch| patch.clone()) + .map(|patch| Delta::now(patch.clone())) + .collect(); + for delta in deltas.iter() { + self.append(serde_json::to_string(delta).unwrap())?; + } + Ok(()) } fn snapshot(&self) -> Result, String> { @@ -160,24 +166,18 @@ impl File { #[derive(Debug, Clone, Serialize, Deserialize)] struct Delta{ ts: u64, - patch: json_patch::Patch, -} - -#[derive(Debug, Clone, Serialize, Deserialize)] -struct TaskTs { - task: Task, - ts: u64, + patch: json_patch::PatchOperation, } impl Delta { - fn new(patch: json_patch::Patch, ts: u64) -> TaskTs { + fn new(patch: json_patch::PatchOperation, ts: u64) -> Delta { Delta{ patch: patch, ts: ts, } } - fn now(patch: json_patch::Patch) -> Delta { + fn now(patch: json_patch::PatchOperation) -> Delta { Self::new(patch, std::time::SystemTime::now().duration_since(std::time::UNIX_EPOCH).unwrap().as_secs().try_into().unwrap()) } }