use std::collections::HashMap;
use serde::Serialize;
#[derive(Debug, Clone, Serialize)]
pub struct ItemUpdate {
pub item_name: Option<String>,
pub item_pos: usize,
pub fields: HashMap<String, Option<String>>,
pub changed_fields: HashMap<String, String>,
pub is_snapshot: bool,
}
impl ItemUpdate {
pub fn get_changed_fields(&self) -> HashMap<String, String> {
self.changed_fields.clone()
}
pub fn get_changed_fields_by_position(&self) -> HashMap<usize, String> {
self.changed_fields
.iter()
.map(|(name, value)| (self.get_field_position(name), value.clone()))
.collect()
}
pub fn get_fields(&self) -> HashMap<String, Option<String>> {
self.fields.clone()
}
pub fn get_fields_by_position(&self) -> HashMap<usize, Option<String>> {
self.fields
.iter()
.map(|(name, value)| (self.get_field_position(name), value.clone()))
.collect()
}
pub fn get_item_name(&self) -> Option<&str> {
self.item_name.as_deref()
}
pub fn get_item_pos(&self) -> usize {
self.item_pos
}
pub fn get_value(&self, field_name_or_pos: &str) -> Option<&str> {
match field_name_or_pos.parse::<usize>() {
Ok(pos) => self
.fields
.iter()
.find(|(name, _)| self.get_field_position(name) == pos)
.and_then(|(_, value)| value.as_deref()),
Err(_) => self
.fields
.get(field_name_or_pos)
.and_then(|v| v.as_deref()),
}
}
pub fn get_value_as_json_patch_if_available(&self, _field_name_or_pos: &str) -> Option<String> {
None
}
pub fn is_snapshot(&self) -> bool {
self.is_snapshot
}
pub fn is_value_changed(&self, field_name_or_pos: &str) -> bool {
match field_name_or_pos.parse::<usize>() {
Ok(pos) => self
.changed_fields
.iter()
.any(|(name, _)| self.get_field_position(name) == pos),
Err(_) => self.changed_fields.contains_key(field_name_or_pos),
}
}
fn get_field_position(&self, _field_name: &str) -> usize {
unimplemented!()
}
}