use crate::vm::{DeferredWhenOperation, PendingAccountUpdate};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
pub type TemporalIndexEntries = Vec<(String, Vec<(Value, i64)>)>;
pub const SNAPSHOT_FORMAT_VERSION: u32 = 1;
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct VmSnapshot {
pub states: HashMap<u32, StateTableSnapshot>,
#[serde(default)]
pub resolver_cache: Vec<ResolverCacheEntrySnapshot>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ResolverCacheEntrySnapshot {
pub key: String,
pub value: Option<Value>,
pub expires_at_epoch_ms: u64,
}
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
pub struct StateTableSnapshot {
pub entity_name: String,
pub data: Vec<(Value, Value)>,
#[serde(default)]
pub lookup_indexes: HashMap<String, Vec<(String, Value)>>,
#[serde(default)]
pub temporal_indexes: HashMap<String, TemporalIndexEntries>,
#[serde(default)]
pub pda_reverse_lookups: HashMap<String, Vec<(String, String)>>,
#[serde(default)]
pub last_account_data: Vec<(String, PendingAccountUpdate)>,
#[serde(default)]
pub version_tracker: Vec<(String, u64, u64)>,
#[serde(default)]
pub instruction_dedup_cache: Vec<(String, u64, u64)>,
#[serde(default)]
pub recent_tx_instructions: Vec<(String, Vec<String>)>,
#[serde(default)]
pub deferred_when_ops: Vec<((String, String), Vec<DeferredWhenOperation>)>,
}
impl VmSnapshot {
pub fn total_entries(&self) -> usize {
self.states.values().map(|table| table.data.len()).sum()
}
pub fn entry_counts(&self) -> HashMap<String, u64> {
self.states
.values()
.map(|table| (table.entity_name.clone(), table.data.len() as u64))
.collect()
}
}