use std::sync::{Arc, Mutex};
use crate::runtime::agents::AgentRow;
pub(crate) struct Teammate {
id: String,
name: String,
agent: tokio::sync::Mutex<mentra::agent::Agent>,
_row: Option<AgentRow>,
}
impl Teammate {
pub(crate) fn new(name: &str, agent: mentra::agent::Agent, row: Option<AgentRow>) -> Self {
Self {
id: agent.id().to_string(),
name: name.to_string(),
agent: tokio::sync::Mutex::new(agent),
_row: row,
}
}
pub(crate) fn id(&self) -> &str {
&self.id
}
pub(crate) fn name(&self) -> &str {
&self.name
}
pub(crate) fn take(&self) -> Option<tokio::sync::MutexGuard<'_, mentra::agent::Agent>> {
self.agent.try_lock().ok()
}
}
impl std::fmt::Debug for Teammate {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Teammate")
.field("id", &self.id)
.field("name", &self.name)
.finish_non_exhaustive()
}
}
#[derive(Debug, Default)]
pub(crate) struct Teammates {
kept: Mutex<Vec<Arc<Teammate>>>,
}
impl Teammates {
pub(crate) fn find(&self, key: &str) -> Option<Arc<Teammate>> {
let kept = self
.kept
.lock()
.unwrap_or_else(|poisoned| poisoned.into_inner());
kept.iter()
.find(|teammate| teammate.id() == key)
.or_else(|| kept.iter().find(|teammate| teammate.name() == key))
.map(Arc::clone)
}
pub(crate) fn keep(&self, teammate: Arc<Teammate>) {
self.kept
.lock()
.unwrap_or_else(|poisoned| poisoned.into_inner())
.push(teammate);
}
pub(crate) fn listed(&self) -> Vec<(String, String)> {
self.kept
.lock()
.unwrap_or_else(|poisoned| poisoned.into_inner())
.iter()
.map(|teammate| (teammate.name().to_string(), teammate.id().to_string()))
.collect()
}
}