use gbp::CodecError;
use serde::{Deserialize, Serialize};
use serde_bytes::ByteBuf;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct GspSignal {
#[serde(rename = "t")]
pub signal_type: u32,
#[serde(rename = "rid")]
pub request_id: u32,
#[serde(rename = "sid")]
pub sender_id: u32,
#[serde(rename = "rc")]
pub role_claim: u32,
#[serde(rename = "alen")]
pub args_length: u32,
#[serde(rename = "args")]
pub args: ByteBuf,
}
impl GspSignal {
pub fn bare(signal_type: u32, request_id: u32, sender_id: u32) -> Self {
Self {
signal_type,
request_id,
sender_id,
role_claim: 0,
args_length: 0,
args: ByteBuf::new(),
}
}
pub fn to_cbor(&self) -> Vec<u8> {
let mut buf = Vec::new();
ciborium::into_writer(self, &mut buf).expect("cbor encode");
buf
}
pub fn from_cbor(data: &[u8]) -> Result<Self, CodecError> {
let s: Self = ciborium::from_reader(data).map_err(|e| CodecError::Decode(e.to_string()))?;
if s.args_length as usize != s.args.len() {
return Err(CodecError::PayloadSizeMismatch);
}
Ok(s)
}
}