use serde::{Deserialize, Serialize};
use super::macros::impl_serialize_as_empty_map;
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct GroupCount;
impl_serialize_as_empty_map!(GroupCount);
#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct GroupCountResponse {
pub count: u16,
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct ListGroups;
impl_serialize_as_empty_map!(ListGroups);
#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct ListGroupsResponse {
pub groups: Vec<u16>,
}
#[derive(Clone, Debug, Serialize, Eq, PartialEq)]
pub struct GroupId {
#[serde(skip_serializing_if = "Option::is_none")]
pub index: Option<u16>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct GroupIdResponse {
pub group: u16,
#[serde(default)]
pub end: bool,
}
#[derive(Clone, Debug, Serialize, Eq, PartialEq)]
pub struct GroupDetails<'a> {
#[serde(skip_serializing_if = "Option::is_none")]
pub groups: Option<&'a [u16]>,
}
#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
pub struct GroupDetailsEntry {
pub group: u16,
pub name: Option<String>,
pub handlers: Option<u8>,
}
#[derive(Clone, Debug, Deserialize, Eq, PartialEq)]
pub struct GroupDetailsResponse {
pub groups: Vec<GroupDetailsEntry>,
}
#[cfg(test)]
mod tests {
use super::super::macros::command_encode_decode_test;
use super::*;
use ciborium::cbor;
command_encode_decode_test! {
group_count,
(0, 10, 0),
GroupCount,
cbor!({}),
cbor!({
"count" => 42,
}),
GroupCountResponse{
count: 42,
},
}
command_encode_decode_test! {
list_groups,
(0, 10, 1),
ListGroups,
cbor!({}),
cbor!({"groups" => [5,69,65535]}),
ListGroupsResponse{ groups: vec![5,69,u16::MAX] },
}
command_encode_decode_test! {
get_group_id_empty,
(0, 10, 2),
GroupId{index: None},
cbor!({}),
cbor!({
"group" => 42,
}),
GroupIdResponse{
group: 42,
end: false,
},
}
command_encode_decode_test! {
get_group_id_full,
(0, 10, 2),
GroupId{index: Some(69)},
cbor!({
"index" => 69,
}),
cbor!({
"group" => 65535,
"end" => true,
}),
GroupIdResponse{
group: u16::MAX,
end: true,
},
}
command_encode_decode_test! {
get_group_details,
(0, 10, 3),
GroupDetails{
groups: None,
},
cbor!({}),
cbor!({
"groups" => [
{
"group" => 69,
},
{
"group" => 42,
"name" => "answer",
"handlers" => 133,
},
]
}),
GroupDetailsResponse{
groups: vec![
GroupDetailsEntry{
group: 69,
name: None,
handlers: None,
},
GroupDetailsEntry{
group: 42,
name: Some("answer".into()),
handlers: Some(133),
},
]
},
}
command_encode_decode_test! {
get_group_details_2,
(0, 10, 3),
GroupDetails{
groups: Some(&[42, 69]),
},
cbor!({
"groups" => [42, 69],
}),
cbor!({
"groups" => []
}),
GroupDetailsResponse{
groups: vec![]
},
}
}