use similar::{ChangeTag, TextDiff};
use crate::state::Snapshot;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DiffChunk {
pub tag: DiffTag,
pub content: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub enum DiffTag {
Equal,
Insert,
Delete,
}
pub fn diff_snapshots(old: &Snapshot, new: &Snapshot) -> Vec<DiffChunk> {
let text_diff = TextDiff::from_lines(&old.debug_repr, &new.debug_repr);
text_diff
.iter_all_changes()
.map(|change| {
let tag = match change.tag() {
ChangeTag::Equal => DiffTag::Equal,
ChangeTag::Insert => DiffTag::Insert,
ChangeTag::Delete => DiffTag::Delete,
};
DiffChunk {
tag,
content: change.value().to_string(),
}
})
.collect()
}