use serde::{Serialize, Deserialize}; use serde::de::DeserializeOwned; use crate::entity::character::CharacterEntityId; #[derive(Debug, Copy, Clone, Serialize, Deserialize, Hash, PartialEq, Eq)] pub struct ServerId(pub usize); #[derive(Debug, Serialize, Deserialize)] pub struct AuthToken(pub String); #[derive(Debug, Serialize, Deserialize)] pub struct Ship { name: String, ip: String, port: u16, } #[derive(Debug, Serialize, Deserialize)] pub enum LoginMessage { SendMail { character_id: CharacterEntityId, title: String, message: String, }, ShipList { ships: Vec, } } #[derive(Debug, Serialize, Deserialize)] pub enum ShipMessage { Authenticate(AuthToken), NewShip(Ship), SendMail { character_id: CharacterEntityId, title: String, message: String, }, RequestShipList, } #[async_trait::async_trait] pub trait InterserverActor { type SendMessage: Serialize; type RecvMessage: DeserializeOwned; type Error; async fn on_connect(&mut self, id: ServerId) -> Vec<(ServerId, Self::SendMessage)>; async fn action(&mut self, id: ServerId, msg: Self::RecvMessage) -> Result, Self::Error>; async fn on_disconnect(&mut self, id: ServerId) -> Vec<(ServerId, Self::SendMessage)>; }