use std::collections::BTreeMap;
use serde::de::DeserializeOwned;
use serde_json::Value;
use crate::session::skipped;
use crate::{SavedAgent, Session};
pub const MODEL: &str = "rig::model";
pub const TITLE: &str = "rig::title";
impl SavedAgent {
pub fn value<T: DeserializeOwned>(&self, key: &str) -> Option<Result<T, serde_json::Error>> {
value(&self.saved, key)
}
pub fn model(&self) -> Option<String> {
self.value(MODEL)?.ok()
}
pub fn title(&self) -> Option<String> {
self.value(TITLE)?.ok()
}
}
fn value<T: DeserializeOwned>(
state: &BTreeMap<String, Value>,
key: &str,
) -> Option<Result<T, serde_json::Error>> {
state.get(key).map(T::deserialize)
}
pub fn main_order(spawned: bool, id: &str) -> (bool, &str) {
(spawned, id)
}
impl Session {
pub fn value<T: DeserializeOwned>(&self, key: &str) -> Option<Result<T, serde_json::Error>> {
value(&self.saved, key)
}
pub fn main_agent(&self) -> Option<&SavedAgent> {
let logs = self.agents.iter().map(|agent| {
let parent = agent.parent.as_deref();
(agent.id.as_str(), parent, agent.retired)
});
let skipped = skipped(logs);
self.agents
.iter()
.filter(|agent| !skipped.contains(agent.id.as_str()))
.min_by_key(|agent| main_order(agent.parent.is_some(), &agent.id))
}
}
#[cfg(test)]
mod tests;