use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct CreateMatch3DAgentSessionRequest { #[serde(default)] pub seed_text: Option, #[serde(default)] pub theme_text: Option, #[serde(default)] pub reference_image_src: Option, #[serde(default)] pub clear_count: Option, #[serde(default)] pub difficulty: Option, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct SendMatch3DAgentMessageRequest { pub client_message_id: String, pub text: String, #[serde(default)] pub quick_fill_requested: Option, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct ExecuteMatch3DAgentActionRequest { pub action: String, #[serde(default)] pub game_name: Option, #[serde(default)] pub summary: Option, #[serde(default)] pub tags: Option>, #[serde(default)] pub cover_image_src: Option, #[serde(default)] pub clear_count: Option, #[serde(default)] pub difficulty: Option, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct Match3DCreatorConfigResponse { pub theme_text: String, #[serde(default)] pub reference_image_src: Option, pub clear_count: u32, pub difficulty: u32, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct Match3DResultDraftResponse { pub game_name: String, pub theme_text: String, pub summary: String, pub tags: Vec, #[serde(default)] pub cover_image_src: Option, #[serde(default)] pub reference_image_src: Option, pub clear_count: u32, pub difficulty: u32, pub publish_ready: bool, pub blockers: Vec, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct Match3DAgentMessageResponse { pub id: String, pub role: String, pub kind: String, pub text: String, pub created_at: String, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct Match3DAgentSessionSnapshotResponse { pub session_id: String, pub current_turn: u32, pub progress_percent: u32, pub stage: String, #[serde(default)] pub config: Option, #[serde(default)] pub draft: Option, pub messages: Vec, #[serde(default)] pub last_assistant_reply: Option, #[serde(default)] pub published_profile_id: Option, pub updated_at: String, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct Match3DAgentSessionResponse { pub session: Match3DAgentSessionSnapshotResponse, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct Match3DAgentActionResponse { pub session: Match3DAgentSessionSnapshotResponse, } #[cfg(test)] mod tests { use super::*; use serde_json::json; #[test] fn create_match3d_session_request_uses_camel_case() { let payload = serde_json::to_value(CreateMatch3DAgentSessionRequest { seed_text: Some("水果消除".to_string()), theme_text: Some("水果".to_string()), reference_image_src: Some("data:image/png;base64,abc".to_string()), clear_count: Some(4), difficulty: Some(3), }) .expect("payload should serialize"); assert_eq!(payload["seedText"], json!("水果消除")); assert_eq!(payload["themeText"], json!("水果")); assert_eq!( payload["referenceImageSrc"], json!("data:image/png;base64,abc") ); assert_eq!(payload["clearCount"], json!(4)); } }