#![allow(
clippy::all,
clippy::pedantic,
dead_code,
unreachable_pub,
unused_imports
)]
use crate::datatypes::SemanticTagStruct;
use crate::error::ClusterError;
use crate::types::Nullable;
use matter_codec::{ContainerKind, Element, Tag, TlvReader, TlvWriter, Value};
pub const CLUSTER_ID: u32 = 0x003C;
pub const CLUSTER_REVISION: u16 = 1;
pub mod command_id {
pub const OPEN_COMMISSIONING_WINDOW: u32 = 0x00;
pub const OPEN_BASIC_COMMISSIONING_WINDOW: u32 = 0x01;
pub const REVOKE_COMMISSIONING: u32 = 0x02;
}
pub mod attribute_id {
pub const WINDOW_STATUS: u32 = 0x0000;
pub const ADMIN_FABRIC_INDEX: u32 = 0x0001;
pub const ADMIN_VENDOR_ID: u32 = 0x0002;
}
bitflags::bitflags! {
#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
pub struct Feature: u32 {
const BC = 1 << 0;
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum CommissioningWindowStatusEnum {
WindowNotOpen,
EnhancedWindowOpen,
BasicWindowOpen,
Unknown(u8),
}
impl CommissioningWindowStatusEnum {
#[must_use]
pub fn from_raw(v: u8) -> Self {
match v {
0 => Self::WindowNotOpen,
1 => Self::EnhancedWindowOpen,
2 => Self::BasicWindowOpen,
other => Self::Unknown(other),
}
}
#[must_use]
pub fn to_raw(self) -> u8 {
match self {
Self::WindowNotOpen => 0,
Self::EnhancedWindowOpen => 1,
Self::BasicWindowOpen => 2,
Self::Unknown(v) => v,
}
}
}
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum StatusCodeEnum {
Busy,
PakeParameterError,
WindowNotOpen,
Unknown(u8),
}
impl StatusCodeEnum {
#[must_use]
pub fn from_raw(v: u8) -> Self {
match v {
2 => Self::Busy,
3 => Self::PakeParameterError,
4 => Self::WindowNotOpen,
other => Self::Unknown(other),
}
}
#[must_use]
pub fn to_raw(self) -> u8 {
match self {
Self::Busy => 2,
Self::PakeParameterError => 3,
Self::WindowNotOpen => 4,
Self::Unknown(v) => v,
}
}
}
pub fn decode_window_status(tlv: &[u8]) -> Result<CommissioningWindowStatusEnum, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => Ok(CommissioningWindowStatusEnum::from_raw(
u8::try_from(v).map_err(|_| ClusterError::InvalidLength("WindowStatus"))?,
)),
_ => Err(ClusterError::UnexpectedType {
context: "WindowStatus",
}),
}
}
pub fn decode_admin_fabric_index(tlv: &[u8]) -> Result<Nullable<u8>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => {
Ok(Nullable::Value(u8::try_from(v).map_err(|_| {
ClusterError::InvalidLength("AdminFabricIndex")
})?))
}
_ => Err(ClusterError::UnexpectedType {
context: "AdminFabricIndex",
}),
}
}
pub fn decode_admin_vendor_id(tlv: &[u8]) -> Result<Nullable<u16>, ClusterError> {
let mut r = TlvReader::new(tlv);
match r.next()? {
Some(Element::Scalar {
value: Value::Null, ..
}) => Ok(Nullable::Null),
Some(Element::Scalar {
value: Value::Uint(v),
..
}) => {
Ok(Nullable::Value(u16::try_from(v).map_err(|_| {
ClusterError::InvalidLength("AdminVendorId")
})?))
}
_ => Err(ClusterError::UnexpectedType {
context: "AdminVendorId",
}),
}
}
#[must_use]
#[allow(clippy::expect_used, clippy::missing_panics_doc)] pub fn encode_open_commissioning_window(
commissioning_timeout: u16,
pake_passcode_verifier: &Vec<u8>,
discriminator: u16,
iterations: u32,
salt: &Vec<u8>,
) -> Vec<u8> {
let mut buf = Vec::new();
let mut w = TlvWriter::new(&mut buf);
w.start_structure(Tag::Anonymous)
.expect("infallible: vec writer");
w.put_uint(Tag::Context(0), u64::from(commissioning_timeout))
.expect("infallible: vec writer");
w.put_bytes(Tag::Context(1), &pake_passcode_verifier)
.expect("infallible: vec writer");
w.put_uint(Tag::Context(2), u64::from(discriminator))
.expect("infallible: vec writer");
w.put_uint(Tag::Context(3), u64::from(iterations))
.expect("infallible: vec writer");
w.put_bytes(Tag::Context(4), &salt)
.expect("infallible: vec writer");
w.end_container().expect("infallible: vec writer");
buf
}
#[must_use]
#[allow(clippy::expect_used, clippy::missing_panics_doc)] pub fn encode_open_basic_commissioning_window(commissioning_timeout: u16) -> Vec<u8> {
let mut buf = Vec::new();
let mut w = TlvWriter::new(&mut buf);
w.start_structure(Tag::Anonymous)
.expect("infallible: vec writer");
w.put_uint(Tag::Context(0), u64::from(commissioning_timeout))
.expect("infallible: vec writer");
w.end_container().expect("infallible: vec writer");
buf
}
#[must_use]
#[allow(clippy::expect_used, clippy::missing_panics_doc)] pub fn encode_revoke_commissioning() -> Vec<u8> {
let mut buf = Vec::new();
let mut w = TlvWriter::new(&mut buf);
w.start_structure(Tag::Anonymous)
.expect("infallible: vec writer");
w.end_container().expect("infallible: vec writer");
buf
}