use crate::game_log_event::GameLogEntryDto;
use crate::game_snapshot_event::GameSnapshotEventDto;
use serde::{Deserialize, Serialize};
use serde_json::Value;
pub use manabrew_protocol::protocol::*;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "kind", rename_all = "camelCase")]
pub enum StateEnvelope {
State {
#[serde(rename = "forPlayer", default, skip_serializing_if = "Option::is_none")]
for_player: Option<String>,
state: Value,
},
Display {
event: Value,
},
Prompt {
#[serde(rename = "forPlayer")]
for_player: String,
prompt: Value,
},
Response {
#[serde(rename = "fromPlayer")]
from_player: String,
#[serde(rename = "promptId", default)]
prompt_id: u32,
action: Value,
},
Directive {
#[serde(rename = "fromPlayer")]
from_player: String,
directive: Value,
},
Log {
#[serde(rename = "fromPlayer")]
from_player: String,
entry: GameLogEntryDto,
},
Snapshot {
#[serde(rename = "fromPlayer")]
from_player: String,
entry: GameSnapshotEventDto,
},
Fatal {
message: String,
},
Error {
#[serde(rename = "forPlayer")]
for_player: String,
error: Value,
},
RoomRelay {
protocol: String,
version: u32,
#[serde(rename = "messageId")]
message_id: String,
#[serde(
rename = "fromPlayer",
default,
skip_serializing_if = "Option::is_none"
)]
from_player: Option<String>,
#[serde(
rename = "targetPlayer",
default,
skip_serializing_if = "Option::is_none"
)]
target_player: Option<String>,
#[serde(rename = "roomId", default, skip_serializing_if = "Option::is_none")]
room_id: Option<String>,
payload: Value,
},
}
impl StateEnvelope {
pub fn for_agent_message(for_player: String, message: &crate::prompt::AgentMessage) -> Self {
use crate::prompt::AgentMessage;
match message {
AgentMessage::State(state) => StateEnvelope::State {
for_player: Some(for_player),
state: serde_json::to_value(state).unwrap_or(Value::Null),
},
AgentMessage::Display(event) => StateEnvelope::Display {
event: serde_json::to_value(event).unwrap_or(Value::Null),
},
AgentMessage::Prompt(prompt) => StateEnvelope::Prompt {
for_player,
prompt: serde_json::to_value(prompt).unwrap_or(Value::Null),
},
AgentMessage::Error(error) => StateEnvelope::Error {
for_player,
error: serde_json::to_value(error).unwrap_or(Value::Null),
},
}
}
}