use std::sync::{Arc, Mutex};
use crate::AgentContext;
#[derive(Clone)]
pub struct AgentContextHandle {
inner: Arc<Mutex<AgentContext>>,
}
impl AgentContextHandle {
#[must_use]
pub fn new(context: AgentContext) -> Self {
Self {
inner: Arc::new(Mutex::new(context)),
}
}
#[must_use]
pub fn snapshot(&self) -> AgentContext {
match self.inner.lock() {
Ok(context) => context.clone(),
Err(error) => error.into_inner().clone(),
}
}
pub fn replace(&self, context: AgentContext) {
match self.inner.lock() {
Ok(mut guard) => *guard = context,
Err(error) => {
let mut guard = error.into_inner();
*guard = context;
}
}
}
pub fn update(&self, update: impl FnOnce(&mut AgentContext)) {
match self.inner.lock() {
Ok(mut guard) => update(&mut guard),
Err(error) => {
let mut guard = error.into_inner();
update(&mut guard);
}
}
}
}
impl Default for AgentContextHandle {
fn default() -> Self {
Self::new(AgentContext::default())
}
}
impl std::fmt::Debug for AgentContextHandle {
fn fmt(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
formatter
.debug_struct("AgentContextHandle")
.field("snapshot", &self.snapshot())
.finish()
}
}