Skip to main content

manabrew_protocol/transport/
mod.rs

1use serde::{Deserialize, Serialize};
2use ts_rs::TS;
3
4use crate::display::DisplayEvent;
5use crate::game::{CardDto, GameViewDto};
6use crate::prompts::{PromptInput, PromptOutput};
7
8#[derive(Debug, Clone)]
9#[allow(clippy::large_enum_variant)]
10pub enum AgentMessage {
11    State(StateUpdate),
12    Display(DisplayEvent),
13    Prompt(AgentPrompt),
14    Error(ProtocolError),
15}
16
17#[derive(Debug, Clone, Serialize, Deserialize, TS)]
18#[serde(rename_all = "camelCase", deny_unknown_fields)]
19#[ts(export, export_to = "transport/messages.ts")]
20pub struct StateUpdate {
21    pub game_view: GameViewDto,
22}
23
24#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, TS)]
25#[serde(tag = "type", rename_all = "camelCase")]
26#[ts(export, export_to = "transport/messages.ts")]
27pub enum DirectiveInput {
28    Concede,
29}
30
31#[derive(Debug, Clone, Serialize, Deserialize, TS)]
32#[serde(
33    tag = "kind",
34    rename_all = "camelCase",
35    rename_all_fields = "camelCase"
36)]
37#[ts(export, export_to = "transport/messages.ts")]
38pub enum ClientToServerMessage {
39    Response {
40        prompt_id: u32,
41        action: PromptOutput,
42    },
43    Directive {
44        directive: DirectiveInput,
45    },
46}
47
48#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, TS)]
49#[serde(rename_all = "camelCase")]
50#[ts(export, export_to = "transport/messages.ts")]
51pub enum ProtocolErrorCode {
52    StalePrompt,
53    WrongPlayer,
54    WrongPromptType,
55    UnknownActionId,
56    CancelNotAllowed,
57    InvalidShape,
58}
59
60#[derive(Debug, Clone, Serialize, Deserialize, TS)]
61#[serde(rename_all = "camelCase", deny_unknown_fields)]
62#[ts(export, export_to = "transport/messages.ts")]
63pub struct ProtocolError {
64    pub code: ProtocolErrorCode,
65    pub message: String,
66    #[serde(default, skip_serializing_if = "Option::is_none")]
67    #[ts(optional)]
68    pub prompt_id: Option<u32>,
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize, TS)]
72#[serde(rename_all = "camelCase", deny_unknown_fields)]
73#[ts(export, export_to = "transport/messages.ts")]
74pub struct AgentPrompt {
75    pub prompt_id: u32,
76    #[serde(default, skip_serializing_if = "String::is_empty")]
77    pub deciding_player_id: String,
78    #[serde(default, skip_serializing_if = "Option::is_none")]
79    #[ts(optional)]
80    pub source_card: Option<CardDto>,
81    pub input: PromptInput,
82}