pub use crate::events::GameEvent;
pub use crate::log::entry::{EntryHeader, LogEntry};
use chrono::{TimeZone, Utc};
pub fn test_timestamp() -> chrono::DateTime<Utc> {
Utc.with_ymd_and_hms(2026, 2, 25, 12, 0, 0)
.single()
.unwrap_or_default()
}
pub fn unity_entry(body: &str) -> LogEntry {
LogEntry {
header: EntryHeader::UnityCrossThreadLogger,
body: body.to_owned(),
}
}
pub fn connection_manager_entry(body: &str) -> LogEntry {
LogEntry {
header: EntryHeader::ConnectionManager,
body: body.to_owned(),
}
}
pub fn matchmaking_entry(body: &str) -> LogEntry {
LogEntry {
header: EntryHeader::Matchmaking,
body: body.to_owned(),
}
}
macro_rules! define_payload_extractor {
($fn_name:ident, $variant:ident) => {
pub fn $fn_name(event: &GameEvent) -> &serde_json::Value {
static EMPTY: std::sync::LazyLock<serde_json::Value> =
std::sync::LazyLock::new(|| serde_json::json!(null));
match event {
GameEvent::$variant(e) => e.payload(),
_ => &EMPTY,
}
}
};
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_unity_entry_sets_header() {
let entry = unity_entry("body");
assert_eq!(entry.header, EntryHeader::UnityCrossThreadLogger);
assert_eq!(entry.body, "body");
}
#[test]
fn test_connection_manager_entry_sets_header() {
let entry = connection_manager_entry("[ConnectionManager] Reconnect succeeded");
assert_eq!(entry.header, EntryHeader::ConnectionManager);
assert_eq!(entry.body, "[ConnectionManager] Reconnect succeeded");
}
#[test]
fn test_matchmaking_entry_sets_header() {
let entry = matchmaking_entry("Matchmaking: GRE connection lost");
assert_eq!(entry.header, EntryHeader::Matchmaking);
assert_eq!(entry.body, "Matchmaking: GRE connection lost");
}
}
define_payload_extractor!(session_payload, Session);
define_payload_extractor!(match_state_payload, MatchState);
define_payload_extractor!(game_state_payload, GameState);
define_payload_extractor!(game_result_payload, GameResult);
define_payload_extractor!(draft_bot_payload, DraftBot);
define_payload_extractor!(draft_human_payload, DraftHuman);
define_payload_extractor!(draft_complete_payload, DraftComplete);
define_payload_extractor!(lifecycle_payload, EventLifecycle);
define_payload_extractor!(rank_payload, Rank);
define_payload_extractor!(deck_collection_payload, DeckCollection);
define_payload_extractor!(inventory_payload, Inventory);
define_payload_extractor!(match_connection_state_payload, MatchConnectionState);
define_payload_extractor!(tcp_connection_close_payload, TcpConnectionClose);
define_payload_extractor!(websocket_closed_payload, WebSocketClosed);
define_payload_extractor!(connection_error_payload, ConnectionError);
define_payload_extractor!(deck_submission_payload, DeckSubmission);