Skip to main content

tanuki_common/capabilities/
on_off.rs

1//! Something that can be turned on and off
2//!
3//! There are exactly two topics; one for state, and one for commands.
4//!
5//! # Example Entity
6//!
7//! ```plain
8//! ../tanuki.on_off/$meta/version => 1
9//! ../tanuki.on_off/on            -> true
10//! ../tanuki.on_off/command       <- "on" | "off" | "toggle"
11//! ```
12
13use crate::{Property, property};
14
15pub trait OnOffProperty: Property {}
16pub trait OnOffCommandTrait: Property {}
17
18#[property(OnOffProperty, State, key = "on")]
19#[derive(Copy, Eq)]
20pub struct On(pub bool);
21
22#[property(OnOffProperty, Command, key = "command")]
23#[derive(Copy, Eq)]
24#[serde(rename_all = "snake_case")]
25pub enum OnOffCommand {
26    On,
27    Off,
28    Toggle,
29}
30
31#[cfg(test)]
32mod tests {
33    use super::*;
34
35    #[test]
36    fn on_property_format() {
37        assert_eq!(serde_json::to_value(On(true)).unwrap(), serde_json::json!(true));
38        assert_eq!(serde_json::to_value(On(false)).unwrap(), serde_json::json!(false));
39    }
40
41    #[test]
42    fn on_off_command_format() {
43        assert_eq!(serde_json::to_value(OnOffCommand::On).unwrap(), serde_json::json!("on"));
44        assert_eq!(serde_json::to_value(OnOffCommand::Off).unwrap(), serde_json::json!("off"));
45        assert_eq!(
46            serde_json::to_value(OnOffCommand::Toggle).unwrap(),
47            serde_json::json!("toggle")
48        );
49    }
50}