turbomcp_protocol/context/
elicitation.rs1use std::collections::HashMap;
7
8use serde::{Deserialize, Serialize};
9use uuid::Uuid;
10
11use super::client::ClientSession;
12use crate::types::Timestamp;
13
14#[derive(Debug, Clone, Serialize, Deserialize)]
16pub struct ElicitationContext {
17 pub elicitation_id: String,
19 pub message: String,
21 pub schema: serde_json::Value,
23 pub constraints: Option<serde_json::Value>,
25 pub defaults: Option<HashMap<String, serde_json::Value>>,
27 pub required: bool,
29 pub timeout_ms: Option<u64>,
31 pub cancellable: bool,
33 pub client_session: Option<ClientSession>,
35 pub requested_at: Timestamp,
37 pub state: ElicitationState,
39 pub metadata: HashMap<String, serde_json::Value>,
41}
42
43#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
45pub enum ElicitationState {
46 Pending,
48 Accepted,
50 Declined,
52 Cancelled,
54 TimedOut,
56}
57
58impl ElicitationContext {
59 pub fn new(message: String, schema: serde_json::Value) -> Self {
61 Self {
62 elicitation_id: Uuid::new_v4().to_string(),
63 message,
64 schema,
65 constraints: None,
66 defaults: None,
67 required: true,
68 timeout_ms: Some(30000),
69 cancellable: true,
70 client_session: None,
71 requested_at: Timestamp::now(),
72 state: ElicitationState::Pending,
73 metadata: HashMap::new(),
74 }
75 }
76
77 pub fn with_client_session(mut self, session: ClientSession) -> Self {
79 self.client_session = Some(session);
80 self
81 }
82
83 pub fn with_timeout(mut self, timeout_ms: u64) -> Self {
85 self.timeout_ms = Some(timeout_ms);
86 self
87 }
88
89 pub fn set_state(&mut self, state: ElicitationState) {
91 self.state = state;
92 }
93
94 pub fn is_complete(&self) -> bool {
96 !matches!(self.state, ElicitationState::Pending)
97 }
98}