use crate::types::Usage;
use std::any::Any;
use std::sync::Arc;
#[derive(Debug, Clone)]
pub struct RunContext {
context: Option<Arc<dyn Any + Send + Sync>>,
usage: Usage,
}
impl RunContext {
pub fn new() -> Self {
Self {
context: None,
usage: Usage::default(),
}
}
pub fn with_context<T: Any + Send + Sync + 'static>(data: T) -> Self {
Self {
context: Some(Arc::new(data)),
usage: Usage::default(),
}
}
pub fn context<T: Any + Send + Sync + 'static>(&self) -> Option<&T> {
self.context.as_ref().and_then(|c| c.downcast_ref::<T>())
}
pub fn usage_mut(&mut self) -> &mut Usage {
&mut self.usage
}
pub fn usage(&self) -> &Usage {
&self.usage
}
pub fn add_usage(&mut self, usage: &Usage) {
self.usage.add(usage);
}
}
impl Default for RunContext {
fn default() -> Self {
Self::new()
}
}