use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct QuestionOption {
pub label: String,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct QuestionInfo {
pub question: String,
pub header: String,
pub options: Vec<QuestionOption>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub multiple: Option<bool>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub custom: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct QuestionToolRef {
pub message_id: String,
pub call_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct QuestionRequest {
pub id: String,
pub session_id: String,
pub questions: Vec<QuestionInfo>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tool: Option<QuestionToolRef>,
}
pub type QuestionAnswer = Vec<String>;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct QuestionReplyRequest {
pub answers: Vec<QuestionAnswer>,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_question_request_deserialize() {
let json = r#"{
"id": "q-1",
"sessionId": "s-1",
"questions": [
{
"question": "Pick one",
"header": "Choice",
"options": [
{"label": "yes", "description": "Allow"},
{"label": "no", "description": "Reject"}
],
"multiple": false,
"custom": true
}
],
"tool": {"messageId": "m-1", "callId": "c-1"}
}"#;
let req: QuestionRequest = serde_json::from_str(json).unwrap();
assert_eq!(req.id, "q-1");
assert_eq!(req.session_id, "s-1");
assert_eq!(req.questions.len(), 1);
assert_eq!(req.questions[0].header, "Choice");
assert!(req.tool.is_some());
}
#[test]
fn test_question_reply_request_serialize() {
let body = QuestionReplyRequest {
answers: vec![vec!["yes".to_string()], vec!["custom-value".to_string()]],
};
let json = serde_json::to_string(&body).unwrap();
assert!(json.contains(r#""answers":[["yes"],["custom-value"]]"#));
}
}