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::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    InvalidShape,
57}
58
59#[derive(Debug, Clone, Serialize, Deserialize, TS)]
60#[serde(rename_all = "camelCase", deny_unknown_fields)]
61#[ts(export, export_to = "transport/messages.ts")]
62pub struct ProtocolError {
63    pub code: ProtocolErrorCode,
64    pub message: String,
65    #[serde(default, skip_serializing_if = "Option::is_none")]
66    #[ts(optional)]
67    pub prompt_id: Option<u32>,
68}
69
70#[derive(Debug, Clone, Serialize, Deserialize, TS)]
71#[serde(rename_all = "camelCase", deny_unknown_fields)]
72#[ts(export, export_to = "transport/messages.ts")]
73pub struct AgentPrompt {
74    pub prompt_id: u32,
75    #[serde(default, skip_serializing_if = "String::is_empty")]
76    pub deciding_player_id: String,
77    #[serde(default, skip_serializing_if = "Option::is_none")]
78    #[ts(optional)]
79    pub source_card_id: Option<String>,
80    pub input: PromptInput,
81}