use alloc::vec::Vec;
use serde::{
Deserialize,
Serialize,
};
use serde_string_enum::{
DeserializeLabeledStringEnum,
SerializeLabeledStringEnum,
};
use crate::battle::{
MonLearnMoveRequest,
MonMoveRequest,
PlayerBattleData,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RequestType {
TeamPreview,
Turn,
Switch,
LearnMove,
Select,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TeamPreviewRequest {
pub max_team_size: Option<usize>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TurnRequest {
pub active: Vec<MonMoveRequest>,
#[serde(default)]
#[serde(skip_serializing_if = "Vec::is_empty")]
pub allies: Vec<PlayerBattleData>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SwitchRequest {
pub needs_switch: Vec<usize>,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct LearnMoveRequest {
pub can_learn_move: MonLearnMoveRequest,
}
#[derive(Debug, Clone, PartialEq, Eq, SerializeLabeledStringEnum, DeserializeLabeledStringEnum)]
pub enum SelectReason {
#[string = "Revive"]
Revive,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SelectPosition {
pub position: usize,
pub reason: SelectReason,
}
#[derive(Debug, Default, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct SelectRequest {
pub positions: Vec<SelectPosition>,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum Request {
#[serde(rename = "team")]
TeamPreview(TeamPreviewRequest),
#[serde(rename = "turn")]
Turn(TurnRequest),
#[serde(rename = "switch")]
Switch(SwitchRequest),
#[serde(rename = "learnmove")]
LearnMove(LearnMoveRequest),
#[serde(rename = "select")]
Select(SelectRequest),
}
impl Request {
pub fn request_type(&self) -> RequestType {
match self {
Self::TeamPreview(_) => RequestType::TeamPreview,
Self::Turn(_) => RequestType::Turn,
Self::Switch(_) => RequestType::Switch,
Self::LearnMove(_) => RequestType::LearnMove,
Self::Select(_) => RequestType::Select,
}
}
}