use sim_citizen_derive::Citizen;
use sim_kernel::{Expr, Result, Symbol};
#[derive(Clone, Debug, PartialEq, Citizen)]
#[citizen(symbol = "server/Address", version = 1)]
pub struct ServerAddressDescriptor {
#[citizen(with = "address_expr")]
address: Expr,
}
#[derive(Clone, Debug, PartialEq, Citizen)]
#[citizen(symbol = "server/Frame", version = 1)]
pub struct ServerFrameDescriptor {
pub version: u64,
pub codec: Symbol,
pub kind: Symbol,
pub msg_id: Option<u64>,
pub correlate: Option<u64>,
pub payload: Vec<u8>,
}
impl ServerAddressDescriptor {
pub fn from_expr(address: Expr) -> Result<Self> {
address_expr::decode(&address)?;
Ok(Self { address })
}
pub fn as_expr(&self) -> &Expr {
&self.address
}
}
impl Default for ServerAddressDescriptor {
fn default() -> Self {
Self::from_expr(Expr::Symbol(Symbol::new("local")))
.expect("default server address descriptor should be valid")
}
}
impl Default for ServerFrameDescriptor {
fn default() -> Self {
Self {
version: 1,
codec: Symbol::qualified("codec", "binary"),
kind: Symbol::new("request"),
msg_id: Some(1),
correlate: None,
payload: b"citizen-frame".to_vec(),
}
}
}
pub fn server_address_class_symbol() -> Symbol {
Symbol::qualified("server", "Address")
}
pub fn server_frame_class_symbol() -> Symbol {
Symbol::qualified("server", "Frame")
}
pub(crate) mod address_expr {
use sim_kernel::{Expr, Result};
use crate::ServerAddress;
pub fn encode(expr: &Expr) -> Expr {
expr.clone()
}
pub fn decode(expr: &Expr) -> Result<Expr> {
ServerAddress::from_expr(expr)?;
Ok(expr.clone())
}
}