use alloc::{string::String, vec::Vec};
use serde::Deserialize;
use crate::common::ZExtUnknown;
#[repr(u8)]
#[derive(Debug, Default, Clone, PartialEq, Eq, Copy, Deserialize)]
pub enum ConsolidationMode {
#[default]
Auto,
None,
Monotonic,
Latest,
}
impl ConsolidationMode {
pub const DEFAULT: Self = Self::Auto;
#[cfg(feature = "test")]
#[doc(hidden)]
pub fn rand() -> Self {
use rand::prelude::SliceRandom;
let mut rng = rand::thread_rng();
*[Self::None, Self::Monotonic, Self::Latest, Self::Auto]
.choose(&mut rng)
.unwrap()
}
}
pub mod flag {
pub const C: u8 = 1 << 5; pub const P: u8 = 1 << 6; pub const Z: u8 = 1 << 7; }
#[derive(Debug, Default, Clone, PartialEq, Eq)]
pub struct Query {
pub consolidation: ConsolidationMode,
pub parameters: String,
pub ext_sinfo: Option<ext::SourceInfoType>,
pub ext_body: Option<ext::QueryBodyType>,
pub ext_attachment: Option<ext::AttachmentType>,
pub ext_unknown: Vec<ZExtUnknown>,
}
pub mod ext {
use crate::{common::ZExtZBuf, zextzbuf};
pub type SourceInfo = zextzbuf!(0x1, false);
pub type SourceInfoType = crate::zenoh::ext::SourceInfoType<{ SourceInfo::ID }>;
pub type QueryBodyType = crate::zenoh::ext::ValueType<{ ZExtZBuf::<0x03>::id(false) }, 0x04>;
pub type Attachment = zextzbuf!(0x5, false);
pub type AttachmentType = crate::zenoh::ext::AttachmentType<{ Attachment::ID }>;
}
impl Query {
#[cfg(feature = "test")]
#[doc(hidden)]
pub fn rand() -> Self {
use rand::{
distributions::{Alphanumeric, DistString},
Rng,
};
use crate::common::iext;
let mut rng = rand::thread_rng();
const MIN: usize = 2;
const MAX: usize = 16;
let consolidation = ConsolidationMode::rand();
let parameters: String = if rng.gen_bool(0.5) {
let len = rng.gen_range(MIN..MAX);
Alphanumeric.sample_string(&mut rng, len)
} else {
String::new()
};
let ext_sinfo = rng.gen_bool(0.5).then_some(ext::SourceInfoType::rand());
let ext_body = rng.gen_bool(0.5).then_some(ext::QueryBodyType::rand());
let ext_attachment = rng.gen_bool(0.5).then_some(ext::AttachmentType::rand());
let mut ext_unknown = Vec::new();
for _ in 0..rng.gen_range(0..4) {
ext_unknown.push(ZExtUnknown::rand2(
iext::mid(ext::Attachment::ID) + 1,
false,
));
}
Self {
consolidation,
parameters,
ext_sinfo,
ext_body,
ext_attachment,
ext_unknown,
}
}
}