use std::any::Any;
use std::path::{Path, PathBuf};
use std::sync::Arc;
use std::time::Duration;
use kaish_types::{OutputFormat, Value};
use crate::backend::KernelBackend;
pub struct PatientGuard {
hold: Option<Box<dyn Any + Send>>,
}
impl PatientGuard {
pub fn inert() -> Self {
Self { hold: None }
}
pub fn held(hold: Box<dyn Any + Send>) -> Self {
Self { hold: Some(hold) }
}
pub fn is_active(&self) -> bool {
self.hold.is_some()
}
}
pub trait ToolCtx: Send + Sync {
fn backend(&self) -> &Arc<dyn KernelBackend>;
fn cwd(&self) -> &Path;
fn resolve_path(&self, path: &str) -> PathBuf;
fn var(&self, name: &str) -> Option<Value>;
fn set_var(&mut self, name: &str, value: Value);
fn set_output_format(&mut self, format: OutputFormat);
fn patient(&self, budget: Duration) -> PatientGuard {
let _ = budget;
PatientGuard::inert()
}
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
}