adk_session/
state_utils.rs1use crate::session::{KEY_PREFIX_APP, KEY_PREFIX_TEMP, KEY_PREFIX_USER};
12use serde_json::Value;
13use std::collections::HashMap;
14
15pub fn extract_state_deltas(
22 delta: &HashMap<String, Value>,
23) -> (HashMap<String, Value>, HashMap<String, Value>, HashMap<String, Value>) {
24 let mut app = HashMap::new();
25 let mut user = HashMap::new();
26 let mut session = HashMap::new();
27
28 for (key, value) in delta {
29 if let Some(clean) = key.strip_prefix(KEY_PREFIX_APP) {
30 app.insert(clean.to_string(), value.clone());
31 } else if let Some(clean) = key.strip_prefix(KEY_PREFIX_USER) {
32 user.insert(clean.to_string(), value.clone());
33 } else if !key.starts_with(KEY_PREFIX_TEMP) {
34 session.insert(key.clone(), value.clone());
35 }
36 }
37
38 (app, user, session)
39}
40
41pub fn merge_states(
43 app: &HashMap<String, Value>,
44 user: &HashMap<String, Value>,
45 session: &HashMap<String, Value>,
46) -> HashMap<String, Value> {
47 let mut merged = session.clone();
48 for (k, v) in app {
49 merged.insert(format!("{KEY_PREFIX_APP}{k}"), v.clone());
50 }
51 for (k, v) in user {
52 merged.insert(format!("{KEY_PREFIX_USER}{k}"), v.clone());
53 }
54 merged
55}