use std::sync::Arc;
use serde_json::Value;
use crate::approve::PromptHost;
pub trait LiveSink: Send + Sync {
fn on_event(&self, event: &Value);
}
#[derive(Clone, Default)]
pub(crate) struct DriveContext {
pub(crate) live: Option<Arc<dyn LiveSink>>,
pub(crate) prompt_host: Option<Arc<dyn PromptHost>>,
}
impl DriveContext {
pub(crate) fn new(
live: Option<Arc<dyn LiveSink>>,
prompt_host: Option<Arc<dyn PromptHost>>,
) -> Self {
Self { live, prompt_host }
}
pub(crate) fn hidden(&self) -> Self {
Self {
live: None,
prompt_host: self.prompt_host.clone(),
}
}
pub(crate) fn show(&self, event: &Value) {
if let Some(live) = &self.live {
live.on_event(event);
}
}
pub(crate) fn can_ask(&self) -> bool {
self.prompt_host.as_deref().is_some_and(PromptHost::can_ask)
}
pub(crate) fn approver(&self) -> Option<Box<dyn basis::Approver>> {
self.prompt_host.as_deref().map(PromptHost::approver)
}
}