use crate::session::{KEY_PREFIX_APP, KEY_PREFIX_TEMP, KEY_PREFIX_USER};
use serde_json::Value;
use std::collections::HashMap;
pub fn extract_state_deltas(
delta: &HashMap<String, Value>,
) -> (HashMap<String, Value>, HashMap<String, Value>, HashMap<String, Value>) {
let mut app = HashMap::new();
let mut user = HashMap::new();
let mut session = HashMap::new();
for (key, value) in delta {
if let Some(clean) = key.strip_prefix(KEY_PREFIX_APP) {
app.insert(clean.to_string(), value.clone());
} else if let Some(clean) = key.strip_prefix(KEY_PREFIX_USER) {
user.insert(clean.to_string(), value.clone());
} else if !key.starts_with(KEY_PREFIX_TEMP) {
session.insert(key.clone(), value.clone());
}
}
(app, user, session)
}
pub fn merge_states(
app: &HashMap<String, Value>,
user: &HashMap<String, Value>,
session: &HashMap<String, Value>,
) -> HashMap<String, Value> {
let mut merged = session.clone();
for (k, v) in app {
merged.insert(format!("{KEY_PREFIX_APP}{k}"), v.clone());
}
for (k, v) in user {
merged.insert(format!("{KEY_PREFIX_USER}{k}"), v.clone());
}
merged
}