use std::io::Write;
use sealed::sealed;
use serde::Serialize;
#[sealed(pub(in crate::pishock::serial))]
pub trait SerialCommand: Serialize {
const ID: &'static str;
}
#[derive(Serialize)]
struct SerialPayload<T> {
#[serde(rename = "cmd")]
id: &'static str,
#[serde(rename = "value")]
data: T,
}
pub fn serialize<T: SerialCommand>(mut writer: impl Write, command: T) -> Result<(), std::io::Error> {
if std::mem::size_of::<T>() != 0 {
serde_json::to_writer(&mut writer, &SerialPayload { id: T::ID, data: command })?;
writer.write_all(b"\n")?;
}
else {
writer.write_fmt(format_args!("{{\"cmd\":\"{}\"}}\n", T::ID))?;
}
return Ok(());
}