use serde::{Deserialize, Serialize}; #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct StartPuzzleRunRequest { pub profile_id: String, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct AdvanceLocalPuzzleNextLevelRequest { pub run: PuzzleRunSnapshotResponse, #[serde(default)] pub source_session_id: Option, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct SwapPuzzlePiecesRequest { pub first_piece_id: String, pub second_piece_id: String, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct DragPuzzlePieceRequest { pub piece_id: String, pub target_row: u32, pub target_col: u32, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct SubmitPuzzleLeaderboardRequest { pub profile_id: String, pub grid_size: u32, pub elapsed_ms: u64, pub nickname: String, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct PuzzleCellPositionResponse { pub row: u32, pub col: u32, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct PuzzlePieceStateResponse { pub piece_id: String, pub correct_row: u32, pub correct_col: u32, pub current_row: u32, pub current_col: u32, #[serde(default)] pub merged_group_id: Option, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)] #[serde(rename_all = "camelCase")] pub struct PuzzleMergedGroupStateResponse { pub group_id: String, pub piece_ids: Vec, pub occupied_cells: Vec, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct PuzzleLeaderboardEntryResponse { pub rank: u32, pub nickname: String, pub elapsed_ms: u64, #[serde(default)] pub is_current_player: bool, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct PuzzleBoardSnapshotResponse { pub rows: u32, pub cols: u32, pub pieces: Vec, pub merged_groups: Vec, #[serde(default)] pub selected_piece_id: Option, pub all_tiles_resolved: bool, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct PuzzleRuntimeLevelSnapshotResponse { pub run_id: String, pub level_index: u32, pub grid_size: u32, pub profile_id: String, pub level_name: String, pub author_display_name: String, pub theme_tags: Vec, #[serde(default)] pub cover_image_src: Option, pub board: PuzzleBoardSnapshotResponse, pub status: String, #[serde(default)] pub started_at_ms: u64, #[serde(default)] pub cleared_at_ms: Option, #[serde(default)] pub elapsed_ms: Option, #[serde(default)] pub leaderboard_entries: Vec, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct PuzzleRunSnapshotResponse { pub run_id: String, pub entry_profile_id: String, pub cleared_level_count: u32, pub current_level_index: u32, pub current_grid_size: u32, pub played_profile_ids: Vec, pub previous_level_tags: Vec, #[serde(default)] pub current_level: Option, #[serde(default)] pub recommended_next_profile_id: Option, #[serde(default)] pub leaderboard_entries: Vec, } #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "camelCase")] pub struct PuzzleRunResponse { pub run: PuzzleRunSnapshotResponse, }