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