manabrew_agent_interface/
protocol.rs1use crate::game_log_event::GameLogEntryDto;
2use crate::game_snapshot_event::GameSnapshotEventDto;
3use serde::{Deserialize, Serialize};
4use serde_json::Value;
5
6pub use manabrew_protocol::protocol::*;
9
10#[derive(Debug, Clone, Serialize, Deserialize)]
16#[serde(tag = "kind", rename_all = "camelCase")]
17pub enum StateEnvelope {
18 State {
19 #[serde(rename = "forPlayer", default, skip_serializing_if = "Option::is_none")]
20 for_player: Option<String>,
21 state: Value,
22 },
23 Display {
24 event: Value,
25 },
26 Prompt {
30 #[serde(rename = "forPlayer")]
31 for_player: String,
32 prompt: Value,
33 },
34 Response {
36 #[serde(rename = "fromPlayer")]
37 from_player: String,
38 #[serde(rename = "promptId", default)]
39 prompt_id: u32,
40 action: Value,
41 },
42 Directive {
43 #[serde(rename = "fromPlayer")]
44 from_player: String,
45 directive: Value,
46 },
47 Log {
49 #[serde(rename = "fromPlayer")]
50 from_player: String,
51 entry: GameLogEntryDto,
52 },
53 Snapshot {
55 #[serde(rename = "fromPlayer")]
56 from_player: String,
57 entry: GameSnapshotEventDto,
58 },
59 Fatal {
60 message: String,
61 },
62 Error {
65 #[serde(rename = "forPlayer")]
66 for_player: String,
67 error: Value,
68 },
69 RoomRelay {
73 protocol: String,
74 version: u32,
75 #[serde(rename = "messageId")]
76 message_id: String,
77 #[serde(
78 rename = "fromPlayer",
79 default,
80 skip_serializing_if = "Option::is_none"
81 )]
82 from_player: Option<String>,
83 #[serde(
84 rename = "targetPlayer",
85 default,
86 skip_serializing_if = "Option::is_none"
87 )]
88 target_player: Option<String>,
89 #[serde(rename = "roomId", default, skip_serializing_if = "Option::is_none")]
90 room_id: Option<String>,
91 payload: Value,
92 },
93}
94
95impl StateEnvelope {
96 pub fn for_agent_message(for_player: String, message: &crate::prompt::AgentMessage) -> Self {
97 use crate::prompt::AgentMessage;
98 match message {
99 AgentMessage::State(state) => StateEnvelope::State {
100 for_player: Some(for_player),
101 state: serde_json::to_value(state).unwrap_or(Value::Null),
102 },
103 AgentMessage::Display(event) => StateEnvelope::Display {
104 event: serde_json::to_value(event).unwrap_or(Value::Null),
105 },
106 AgentMessage::Prompt(prompt) => StateEnvelope::Prompt {
107 for_player,
108 prompt: serde_json::to_value(prompt).unwrap_or(Value::Null),
109 },
110 AgentMessage::Error(error) => StateEnvelope::Error {
111 for_player,
112 error: serde_json::to_value(error).unwrap_or(Value::Null),
113 },
114 }
115 }
116}