use std::collections::{HashSet, VecDeque};
use std::sync::{Arc, Mutex};
use serde::{Deserialize, Serialize};
use crate::harness::message::Message;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", tag = "command")]
pub enum SteeringCommand {
Pause,
Resume,
Cancel,
InjectMessage(Message),
Redirect {
instruction: String,
},
SetMetadata {
metadata: serde_json::Value,
},
}
impl SteeringCommand {
pub fn kind(&self) -> SteeringCommandKind {
match self {
SteeringCommand::Pause => SteeringCommandKind::Pause,
SteeringCommand::Resume => SteeringCommandKind::Resume,
SteeringCommand::Cancel => SteeringCommandKind::Cancel,
SteeringCommand::InjectMessage(_) => SteeringCommandKind::InjectMessage,
SteeringCommand::Redirect { .. } => SteeringCommandKind::Redirect,
SteeringCommand::SetMetadata { .. } => SteeringCommandKind::SetMetadata,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum SteeringCommandKind {
Pause,
Resume,
Cancel,
InjectMessage,
Redirect,
SetMetadata,
}
impl SteeringCommandKind {
pub const ALL: [SteeringCommandKind; 6] = [
SteeringCommandKind::Pause,
SteeringCommandKind::Resume,
SteeringCommandKind::Cancel,
SteeringCommandKind::InjectMessage,
SteeringCommandKind::Redirect,
SteeringCommandKind::SetMetadata,
];
pub fn as_str(self) -> &'static str {
match self {
SteeringCommandKind::Pause => "pause",
SteeringCommandKind::Resume => "resume",
SteeringCommandKind::Cancel => "cancel",
SteeringCommandKind::InjectMessage => "inject_message",
SteeringCommandKind::Redirect => "redirect",
SteeringCommandKind::SetMetadata => "set_metadata",
}
}
}
#[derive(Clone, Debug, Default, PartialEq)]
pub struct SteeringPolicy {
pub(crate) allowed: HashSet<SteeringCommandKind>,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum SteeringOutcome {
Continue,
Pause,
Cancel,
}
#[derive(Clone)]
pub struct SteeringHandle {
pub(crate) inner: Arc<SteeringInner>,
}
pub(crate) struct SteeringInner {
pub(crate) queue: Mutex<VecDeque<SteeringCommand>>,
pub(crate) policy: SteeringPolicy,
}