use sim_citizen_derive::Citizen;
use sim_kernel::{Expr, Result, Symbol};
use crate::{DataPacket, StreamPacket};
#[derive(Clone, Debug, PartialEq, Citizen)]
#[citizen(symbol = "stream/Packet", version = 1)]
pub struct StreamPacketDescriptor {
#[citizen(with = "packet_expr")]
packet: Expr,
}
impl StreamPacketDescriptor {
pub fn new(packet: StreamPacket) -> Self {
Self {
packet: packet.to_expr(),
}
}
pub fn from_expr(expr: Expr) -> Result<Self> {
packet_expr::decode(&expr)?;
Ok(Self { packet: expr })
}
pub fn packet(&self) -> Result<StreamPacket> {
StreamPacket::try_from(self.packet.clone())
}
pub fn as_expr(&self) -> &Expr {
&self.packet
}
}
impl Default for StreamPacketDescriptor {
fn default() -> Self {
Self::new(StreamPacket::Data(DataPacket::new(
Symbol::qualified("stream/data", "citizen-fixture"),
Expr::String("packet".to_owned()),
)))
}
}
pub fn stream_packet_class_symbol() -> Symbol {
Symbol::qualified("stream", "Packet")
}
pub(crate) mod packet_expr {
use sim_kernel::{Expr, Result};
use crate::StreamPacket;
pub fn encode(expr: &Expr) -> Expr {
expr.clone()
}
pub fn decode(expr: &Expr) -> Result<Expr> {
StreamPacket::try_from(expr.clone())?;
Ok(expr.clone())
}
}