manabrew_protocol/transport/
mod.rs1use 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}