opencode_sdk/types/
question.rs1use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
10#[serde(rename_all = "camelCase")]
11pub struct QuestionOption {
12 pub label: String,
14 pub description: String,
16}
17
18#[derive(Debug, Clone, Serialize, Deserialize)]
20#[serde(rename_all = "camelCase")]
21pub struct QuestionInfo {
22 pub question: String,
24 pub header: String,
26 pub options: Vec<QuestionOption>,
28 #[serde(default, skip_serializing_if = "Option::is_none")]
30 pub multiple: Option<bool>,
31 #[serde(default, skip_serializing_if = "Option::is_none")]
33 pub custom: Option<bool>,
34}
35
36#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
38#[serde(rename_all = "camelCase")]
39pub struct QuestionToolRef {
40 pub message_id: String,
42 pub call_id: String,
44}
45
46#[derive(Debug, Clone, Serialize, Deserialize)]
48#[serde(rename_all = "camelCase")]
49pub struct QuestionRequest {
50 pub id: String,
52 pub session_id: String,
54 pub questions: Vec<QuestionInfo>,
56 #[serde(default, skip_serializing_if = "Option::is_none")]
58 pub tool: Option<QuestionToolRef>,
59}
60
61pub type QuestionAnswer = Vec<String>;
65
66#[derive(Debug, Clone, Serialize, Deserialize)]
68#[serde(rename_all = "camelCase")]
69pub struct QuestionReplyRequest {
70 pub answers: Vec<QuestionAnswer>,
72}
73
74#[cfg(test)]
75mod tests {
76 use super::*;
77
78 #[test]
79 fn test_question_request_deserialize() {
80 let json = r#"{
81 "id": "q-1",
82 "sessionId": "s-1",
83 "questions": [
84 {
85 "question": "Pick one",
86 "header": "Choice",
87 "options": [
88 {"label": "yes", "description": "Allow"},
89 {"label": "no", "description": "Reject"}
90 ],
91 "multiple": false,
92 "custom": true
93 }
94 ],
95 "tool": {"messageId": "m-1", "callId": "c-1"}
96 }"#;
97
98 let req: QuestionRequest = serde_json::from_str(json).unwrap();
99 assert_eq!(req.id, "q-1");
100 assert_eq!(req.session_id, "s-1");
101 assert_eq!(req.questions.len(), 1);
102 assert_eq!(req.questions[0].header, "Choice");
103 assert!(req.tool.is_some());
104 }
105
106 #[test]
107 fn test_question_reply_request_serialize() {
108 let body = QuestionReplyRequest {
109 answers: vec![vec!["yes".to_string()], vec!["custom-value".to_string()]],
110 };
111
112 let json = serde_json::to_string(&body).unwrap();
113 assert!(json.contains(r#""answers":[["yes"],["custom-value"]]"#));
114 }
115}