use std::collections::HashMap;
use serde_json::Value;
use crate::usage::Usage;
#[derive(Debug, Clone, Default)]
pub struct RunContext {
usage: Usage,
step: usize,
agent_name: Option<String>,
state: HashMap<String, Value>,
}
impl RunContext {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn with_agent_name(mut self, name: impl Into<String>) -> Self {
self.agent_name = Some(name.into());
self
}
#[must_use]
pub const fn with_step(mut self, step: usize) -> Self {
self.step = step;
self
}
#[must_use]
pub const fn with_usage(mut self, usage: Usage) -> Self {
self.usage = usage;
self
}
#[must_use]
pub const fn usage(&self) -> &Usage {
&self.usage
}
#[must_use]
pub const fn step(&self) -> usize {
self.step
}
#[must_use]
pub fn agent_name(&self) -> Option<&str> {
self.agent_name.as_deref()
}
#[must_use]
pub const fn state(&self) -> &HashMap<String, Value> {
&self.state
}
#[must_use]
pub fn get_state(&self, key: &str) -> Option<&Value> {
self.state.get(key)
}
pub fn set_state(&mut self, key: impl Into<String>, value: Value) {
self.state.insert(key.into(), value);
}
pub fn remove_state(&mut self, key: &str) -> Option<Value> {
self.state.remove(key)
}
pub fn add_usage(&mut self, usage: Usage) {
self.usage += usage;
}
pub const fn advance_step(&mut self) {
self.step += 1;
}
pub fn set_agent_name(&mut self, name: impl Into<String>) {
self.agent_name = Some(name.into());
}
pub fn reset(&mut self) {
self.usage = Usage::zero();
self.step = 0;
self.state.clear();
}
}