govee_api/utils/
request.rs

1use serde::de;
2// ------------------------
3// Handling Govee Issues
4// ------------------------
5//
6
7// Deserialize a boolean value from a given deserializer.
8//
9// This function deserializes a boolean value from the provided deserializer. It handles
10// both boolean values and string representations of 'true' and 'false'. If the incoming
11// value is a boolean, it is returned directly. If the incoming value is a string 'true',
12// it returns true; if it's a string 'false', it returns false. For any other input, an
13// error is returned.
14//
15// # Arguments
16//
17// * `deserializer` - The deserializer implementing the `de::Deserializer` trait.
18//
19// # Returns
20//
21// Returns a `Result` containing the deserialized boolean value if successful, or an
22// error of type `D::Error` if deserialization fails or the input is not a valid boolean
23// representation.
24//
25// # Examples
26//
27// ```rust
28// use serde::de::Deserialize;
29//
30// let json = r#""true""#;
31// let deserializer = serde_json::Deserializer::from_str(json);
32// let result: Result<bool, _> = deserialize_bool(deserializer);
33// assert_eq!(result, Ok(true));
34// ```
35//
36// ```rust
37// use serde::de::Deserialize;
38//
39// let json = r#"false"#;
40// let deserializer = serde_json::Deserializer::from_str(json);
41// let result: Result<bool, _> = deserialize_bool(deserializer);
42// assert_eq!(result, Ok(false));
43// ```
44//
45// ```rust
46// use serde::de::Deserialize;
47//
48// let json = r#"42"#; // This input is not a valid boolean representation
49// let deserializer = serde_json::Deserializer::from_str(json);
50// let result: Result<bool, _> = deserialize_bool(deserializer);
51// assert!(result.is_err());
52// ```
53pub fn deserialize_bool<'de, D>(deserializer: D) -> Result<bool, D::Error>
54where
55    D: de::Deserializer<'de>,
56{
57    // If the incoming value is a string 'true' or 'false', return true or false
58    // If the incoming value is a boolean, return the boolean
59    match serde::Deserialize::deserialize(deserializer)? {
60        serde_json::Value::Bool(b) => Ok(b),
61        serde_json::Value::String(s) if s == "true" => Ok(true),
62        serde_json::Value::String(s) if s == "false" => Ok(false),
63        _ => Err(serde::de::Error::custom(
64            "Expected a boolean or 'true'/'false' string",
65        )),
66    }
67}