Skip to content

Commit 99b0e60

Browse files
committed
Changed PropertyFormat for Boolean
1 parent e26c074 commit 99b0e60

File tree

3 files changed

+45
-25
lines changed

3 files changed

+45
-25
lines changed

examples/device_mini_example.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -218,10 +218,10 @@ fn make_device_description(
218218
prop_light_state.prop_id().clone(),
219219
PropertyDescriptionBuilder::new(HomieDataType::Boolean)
220220
.name("Light state")
221-
.format(HomiePropertyFormat::Boolean {
221+
.format(HomiePropertyFormat::Boolean(BooleanFormat {
222222
false_val: "off".to_string(),
223223
true_val: "on".to_string(),
224-
})
224+
}))
225225
.settable(true)
226226
.build(),
227227
)

examples/devices/light_device.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ use rumqttc::AsyncClient;
44

55
use homie5::{
66
device_description::{
7-
DeviceDescriptionBuilder, HomieDeviceDescription, HomiePropertyFormat, IntegerRange, NodeDescriptionBuilder,
8-
PropertyDescriptionBuilder,
7+
BooleanFormat, DeviceDescriptionBuilder, HomieDeviceDescription, HomiePropertyFormat, IntegerRange,
8+
NodeDescriptionBuilder, PropertyDescriptionBuilder,
99
},
1010
Homie5DeviceProtocol, HomieDataType, HomieDeviceStatus, HomieDomain, HomieID, HomieValue, NodeRef, PropertyRef,
1111
HOMIE_UNIT_PERCENT,
@@ -61,10 +61,10 @@ impl LightDevice {
6161
prop_light_state.prop_id().clone(),
6262
PropertyDescriptionBuilder::new(HomieDataType::Boolean)
6363
.name("Light state")
64-
.format(HomiePropertyFormat::Boolean {
64+
.format(HomiePropertyFormat::Boolean(BooleanFormat {
6565
false_val: "off".to_string(),
6666
true_val: "on".to_string(),
67-
})
67+
}))
6868
.retained(true)
6969
.settable(true)
7070
.build(),

src/device_description/property_format.rs

+39-19
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ pub enum HomiePropertyFormat {
1616
IntegerRange(IntegerRange),
1717
Enum(Vec<String>),
1818
Color(Vec<ColorFormat>),
19-
Boolean { false_val: String, true_val: String },
19+
Boolean(BooleanFormat),
2020
Json(String), // Raw JSON schema as string
2121
Custom(String),
2222
Empty,
@@ -32,7 +32,7 @@ impl HomiePropertyFormat {
3232
HomiePropertyFormat::IntegerRange(r) => r.is_empty(),
3333
HomiePropertyFormat::Enum(values) => values.is_empty(),
3434
HomiePropertyFormat::Color(formats) => formats.is_empty(),
35-
HomiePropertyFormat::Boolean { false_val, true_val } => false_val.is_empty() || true_val.is_empty(),
35+
HomiePropertyFormat::Boolean(bf) => bf.is_empty(),
3636
HomiePropertyFormat::Json(data) => data.is_empty(),
3737
HomiePropertyFormat::Custom(data) => data.is_empty(),
3838
HomiePropertyFormat::Empty => true,
@@ -56,16 +56,49 @@ impl Display for HomiePropertyFormat {
5656
formats.iter().map(|c| c.to_string()).collect::<Vec<String>>().join(",")
5757
)
5858
}
59-
HomiePropertyFormat::Boolean { false_val, true_val } => {
60-
write!(f, "{},{}", false_val, true_val)
61-
}
59+
HomiePropertyFormat::Boolean(bf) => bf.fmt(f),
6260
HomiePropertyFormat::Json(data) => write!(f, "{}", data),
6361
HomiePropertyFormat::Custom(data) => write!(f, "{}", data),
6462
HomiePropertyFormat::Empty => write!(f, ""),
6563
}
6664
}
6765
}
6866

67+
#[derive(Debug, Serialize, Deserialize, Clone, Hash, PartialEq, PartialOrd)]
68+
pub struct BooleanFormat {
69+
pub false_val: String,
70+
pub true_val: String,
71+
}
72+
73+
impl BooleanFormat {
74+
pub fn is_empty(&self) -> bool {
75+
self.false_val.is_empty() && self.true_val.is_empty()
76+
}
77+
}
78+
79+
impl Display for BooleanFormat {
80+
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
81+
write!(f, "{},{}", self.false_val, self.true_val)
82+
}
83+
}
84+
85+
impl FromStr for BooleanFormat {
86+
type Err = HomiePropertyFormatError;
87+
fn from_str(s: &str) -> Result<Self, Self::Err> {
88+
let tokens = s.split(',').collect::<Vec<&str>>();
89+
if tokens.len() != 2 {
90+
return Err(HomiePropertyFormatError::BooleanFormatError);
91+
}
92+
if tokens[0].is_empty() || tokens[1].is_empty() || tokens[0] == tokens[1] {
93+
return Err(HomiePropertyFormatError::BooleanFormatError);
94+
}
95+
96+
Ok(Self {
97+
false_val: tokens[0].to_owned(),
98+
true_val: tokens[1].to_owned(),
99+
})
100+
}
101+
}
69102
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Hash, PartialOrd)]
70103
pub enum ColorFormat {
71104
Rgb,
@@ -141,20 +174,7 @@ impl HomiePropertyFormat {
141174
}
142175
Ok(Self::Color(formats))
143176
}
144-
HomieDataType::Boolean => {
145-
let tokens = raw.split(',').collect::<Vec<&str>>();
146-
if tokens.len() != 2 {
147-
return Err(HomiePropertyFormatError::BooleanFormatError);
148-
}
149-
if tokens[0].is_empty() || tokens[1].is_empty() || tokens[0] == tokens[1] {
150-
return Err(HomiePropertyFormatError::BooleanFormatError);
151-
}
152-
153-
Ok(Self::Boolean {
154-
false_val: tokens[0].to_owned(),
155-
true_val: tokens[1].to_owned(),
156-
})
157-
}
177+
HomieDataType::Boolean => Ok(Self::Boolean(BooleanFormat::from_str(raw)?)),
158178
HomieDataType::JSON => Ok(Self::Json(raw.to_owned())), // todo: we need to check if
159179
// this contains valid json
160180
// string data

0 commit comments

Comments
 (0)