use zenoh_buffers::buffer::Buffer;
use crate::zenoh::reply::ReplyBody;
use crate::{core::WireExpr, network::RequestId, zenoh::ResponseBody};
pub mod flag {
pub const N: u8 = 1 << 5; pub const M: u8 = 1 << 6; pub const Z: u8 = 1 << 7; }
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Response {
pub rid: RequestId,
pub wire_expr: WireExpr<'static>,
pub payload: ResponseBody,
pub ext_qos: ext::QoSType,
pub ext_tstamp: Option<ext::TimestampType>,
pub ext_respid: Option<ext::ResponderIdType>,
}
pub mod ext {
use crate::{zextz64, zextzbuf};
pub type QoS = zextz64!(0x1, false);
pub type QoSType = crate::network::ext::QoSType<{ QoS::ID }>;
pub type Timestamp = zextzbuf!(0x2, false);
pub type TimestampType = crate::network::ext::TimestampType<{ Timestamp::ID }>;
pub type ResponderId = zextzbuf!(0x3, false);
pub type ResponderIdType = crate::network::ext::EntityGlobalIdType<{ ResponderId::ID }>;
}
impl Response {
pub fn payload_size(&self) -> usize {
match &self.payload {
ResponseBody::Reply(r) => match &r.payload {
ReplyBody::Put(p) => {
p.payload.len() + p.ext_attachment.as_ref().map_or(0, |a| a.buffer.len())
}
ReplyBody::Del(d) => d.ext_attachment.as_ref().map_or(0, |a| a.buffer.len()),
},
ResponseBody::Err(e) => e.payload.len(),
}
}
#[cfg(feature = "test")]
#[doc(hidden)]
pub fn rand() -> Self {
use rand::Rng;
let mut rng = rand::thread_rng();
let rid: RequestId = rng.gen();
let wire_expr = WireExpr::rand();
let payload = ResponseBody::rand();
let ext_qos = ext::QoSType::rand();
let ext_tstamp = rng.gen_bool(0.5).then(ext::TimestampType::rand);
let ext_respid = rng.gen_bool(0.5).then(ext::ResponderIdType::rand);
Self {
rid,
wire_expr,
payload,
ext_qos,
ext_tstamp,
ext_respid,
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ResponseFinal {
pub rid: RequestId,
pub ext_qos: ext::QoSType,
pub ext_tstamp: Option<ext::TimestampType>,
}
impl ResponseFinal {
#[cfg(feature = "test")]
#[doc(hidden)]
pub fn rand() -> Self {
use rand::Rng;
let mut rng = rand::thread_rng();
let rid: RequestId = rng.gen();
let ext_qos = ext::QoSType::rand();
let ext_tstamp = rng.gen_bool(0.5).then(ext::TimestampType::rand);
Self {
rid,
ext_qos,
ext_tstamp,
}
}
}