matc/clusters/codec/
mode_dishwasher.rs

1//! Matter TLV encoders and decoders for Dishwasher Mode Cluster
2//! Cluster ID: 0x0059
3//!
4//! This file is automatically generated from Mode_Dishwasher.xml
5
6use crate::tlv;
7use anyhow;
8use serde_json;
9
10
11// Enum definitions
12
13#[derive(Debug, Clone, Copy, PartialEq, Eq, serde::Serialize, serde::Deserialize)]
14#[repr(u16)]
15pub enum ModeTag {
16    Auto = 0,
17    Quick = 1,
18    Quiet = 2,
19    Lownoise = 3,
20    Lowenergy = 4,
21    Vacation = 5,
22    Min = 6,
23    Max = 7,
24    Night = 8,
25    Day = 9,
26    Normal = 16384,
27    Heavy = 16385,
28    Light = 16386,
29}
30
31impl ModeTag {
32    /// Convert from u8 value (promoted to u16)
33    pub fn from_u8(value: u8) -> Option<Self> {
34        Self::from_u16(value as u16)
35    }
36
37    /// Convert from u16 value
38    pub fn from_u16(value: u16) -> Option<Self> {
39        match value {
40            0 => Some(ModeTag::Auto),
41            1 => Some(ModeTag::Quick),
42            2 => Some(ModeTag::Quiet),
43            3 => Some(ModeTag::Lownoise),
44            4 => Some(ModeTag::Lowenergy),
45            5 => Some(ModeTag::Vacation),
46            6 => Some(ModeTag::Min),
47            7 => Some(ModeTag::Max),
48            8 => Some(ModeTag::Night),
49            9 => Some(ModeTag::Day),
50            16384 => Some(ModeTag::Normal),
51            16385 => Some(ModeTag::Heavy),
52            16386 => Some(ModeTag::Light),
53            _ => None,
54        }
55    }
56
57    /// Convert to u8 value (truncated if value > 255)
58    pub fn to_u8(self) -> u8 {
59        self as u8
60    }
61
62    /// Convert to u16 value
63    pub fn to_u16(self) -> u16 {
64        self as u16
65    }
66}
67
68impl From<ModeTag> for u16 {
69    fn from(val: ModeTag) -> Self {
70        val as u16
71    }
72}
73
74// Struct definitions
75
76#[derive(Debug, serde::Serialize)]
77pub struct ModeOption {
78    pub label: Option<u8>,
79    pub mode: Option<u8>,
80    pub mode_tags: Option<u8>,
81}
82
83// Attribute decoders
84
85/// Decode SupportedModes attribute (0x0000)
86pub fn decode_supported_modes(inp: &tlv::TlvItemValue) -> anyhow::Result<u8> {
87    if let tlv::TlvItemValue::Int(v) = inp {
88        Ok(*v as u8)
89    } else {
90        Err(anyhow::anyhow!("Expected UInt8"))
91    }
92}
93
94/// Decode CurrentMode attribute (0x0001)
95pub fn decode_current_mode(inp: &tlv::TlvItemValue) -> anyhow::Result<u8> {
96    if let tlv::TlvItemValue::Int(v) = inp {
97        Ok(*v as u8)
98    } else {
99        Err(anyhow::anyhow!("Expected UInt8"))
100    }
101}
102
103/// Decode StartUpMode attribute (0x0002)
104pub fn decode_start_up_mode(inp: &tlv::TlvItemValue) -> anyhow::Result<u8> {
105    if let tlv::TlvItemValue::Int(v) = inp {
106        Ok(*v as u8)
107    } else {
108        Err(anyhow::anyhow!("Expected UInt8"))
109    }
110}
111
112/// Decode OnMode attribute (0x0003)
113pub fn decode_on_mode(inp: &tlv::TlvItemValue) -> anyhow::Result<u8> {
114    if let tlv::TlvItemValue::Int(v) = inp {
115        Ok(*v as u8)
116    } else {
117        Err(anyhow::anyhow!("Expected UInt8"))
118    }
119}
120
121
122// JSON dispatcher function
123
124/// Decode attribute value and return as JSON string
125///
126/// # Parameters
127/// * `cluster_id` - The cluster identifier
128/// * `attribute_id` - The attribute identifier
129/// * `tlv_value` - The TLV value to decode
130///
131/// # Returns
132/// JSON string representation of the decoded value or error
133pub fn decode_attribute_json(cluster_id: u32, attribute_id: u32, tlv_value: &crate::tlv::TlvItemValue) -> String {
134    // Verify this is the correct cluster
135    if cluster_id != 0x0059 {
136        return format!("{{\"error\": \"Invalid cluster ID. Expected 0x0059, got {}\"}}", cluster_id);
137    }
138
139    match attribute_id {
140        0x0000 => {
141            match decode_supported_modes(tlv_value) {
142                Ok(value) => serde_json::to_string(&value).unwrap_or_else(|_| "null".to_string()),
143                Err(e) => format!("{{\"error\": \"{}\"}}", e),
144            }
145        }
146        0x0001 => {
147            match decode_current_mode(tlv_value) {
148                Ok(value) => serde_json::to_string(&value).unwrap_or_else(|_| "null".to_string()),
149                Err(e) => format!("{{\"error\": \"{}\"}}", e),
150            }
151        }
152        0x0002 => {
153            match decode_start_up_mode(tlv_value) {
154                Ok(value) => serde_json::to_string(&value).unwrap_or_else(|_| "null".to_string()),
155                Err(e) => format!("{{\"error\": \"{}\"}}", e),
156            }
157        }
158        0x0003 => {
159            match decode_on_mode(tlv_value) {
160                Ok(value) => serde_json::to_string(&value).unwrap_or_else(|_| "null".to_string()),
161                Err(e) => format!("{{\"error\": \"{}\"}}", e),
162            }
163        }
164        _ => format!("{{\"error\": \"Unknown attribute ID: {}\"}}", attribute_id),
165    }
166}
167
168/// Get list of all attributes supported by this cluster
169///
170/// # Returns
171/// Vector of tuples containing (attribute_id, attribute_name)
172pub fn get_attribute_list() -> Vec<(u32, &'static str)> {
173    vec![
174        (0x0000, "SupportedModes"),
175        (0x0001, "CurrentMode"),
176        (0x0002, "StartUpMode"),
177        (0x0003, "OnMode"),
178    ]
179}
180