use std::collections::HashMap;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use super::client::ClientSession;
use crate::types::Timestamp;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ElicitationContext {
pub elicitation_id: String,
pub message: String,
pub schema: serde_json::Value,
pub constraints: Option<serde_json::Value>,
pub defaults: Option<HashMap<String, serde_json::Value>>,
pub required: bool,
pub timeout_ms: Option<u64>,
pub cancellable: bool,
pub client_session: Option<ClientSession>,
pub requested_at: Timestamp,
pub state: ElicitationState,
pub metadata: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum ElicitationState {
Pending,
Accepted,
Declined,
Cancelled,
TimedOut,
}
impl ElicitationContext {
pub fn new(message: String, schema: serde_json::Value) -> Self {
Self {
elicitation_id: Uuid::new_v4().to_string(),
message,
schema,
constraints: None,
defaults: None,
required: true,
timeout_ms: Some(30000),
cancellable: true,
client_session: None,
requested_at: Timestamp::now(),
state: ElicitationState::Pending,
metadata: HashMap::new(),
}
}
pub fn with_client_session(mut self, session: ClientSession) -> Self {
self.client_session = Some(session);
self
}
pub fn with_timeout(mut self, timeout_ms: u64) -> Self {
self.timeout_ms = Some(timeout_ms);
self
}
pub fn set_state(&mut self, state: ElicitationState) {
self.state = state;
}
pub fn is_complete(&self) -> bool {
!matches!(self.state, ElicitationState::Pending)
}
}