use solana_account::Account;
use solana_pubkey::Pubkey;
pub struct AccountDiff {
pub pubkey: Pubkey,
pub pre: Option<Account>,
pub post: Option<Account>,
}
impl AccountDiff {
pub fn is_changed(&self) -> bool {
self.pre != self.post
}
pub fn was_created(&self) -> bool {
self.pre.is_none() && self.post.is_some()
}
pub fn was_deleted(&self) -> bool {
self.pre.is_some() && self.post.is_none()
}
pub fn lamports_delta(&self) -> (u64, u64) {
let pre = self.pre.as_ref().map(|a| a.lamports).unwrap_or(0);
let post = self.post.as_ref().map(|a| a.lamports).unwrap_or(0);
(pre, post)
}
pub fn changed_data_ranges(&self) -> Vec<(usize, usize)> {
let pre_data = self.pre.as_ref().map(|a| a.data.as_slice()).unwrap_or(&[]);
let post_data = self.post.as_ref().map(|a| a.data.as_slice()).unwrap_or(&[]);
let mut ranges = Vec::new();
let min_len = pre_data.len().min(post_data.len());
let mut i = 0;
while i < min_len {
if pre_data[i] != post_data[i] {
let start = i;
while i < min_len && pre_data[i] != post_data[i] {
i += 1;
}
ranges.push((start, i - start));
} else {
i += 1;
}
}
let max_len = pre_data.len().max(post_data.len());
if max_len > min_len {
ranges.push((min_len, max_len - min_len));
}
ranges
}
}