Skip to main content

alarm_dot_com/models/
device.rs

1//! Shared device traits and base types.
2
3use serde::{Deserialize, Serialize};
4use std::fmt;
5
6/// Resource types used in Alarm.com API paths.
7#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
8pub enum ResourceType {
9    Partition,
10    Sensor,
11    Lock,
12    GarageDoor,
13    Gate,
14    Light,
15    Thermostat,
16    Camera,
17    WaterSensor,
18    WaterValve,
19    System,
20    ImageSensor,
21}
22
23impl ResourceType {
24    /// The API path segment for this resource type (camelCase, pluralized).
25    pub fn api_path(&self) -> &'static str {
26        match self {
27            ResourceType::Partition => "devices/partitions",
28            ResourceType::Sensor => "devices/sensors",
29            ResourceType::Lock => "devices/locks",
30            ResourceType::GarageDoor => "devices/garageDoors",
31            ResourceType::Gate => "devices/gates",
32            ResourceType::Light => "devices/lights",
33            ResourceType::Thermostat => "devices/thermostats",
34            ResourceType::Camera => "devices/cameras",
35            ResourceType::WaterSensor => "devices/waterSensors",
36            ResourceType::WaterValve => "devices/waterValves",
37            ResourceType::System => "systems/systems",
38            ResourceType::ImageSensor => "devices/imageSensors",
39        }
40    }
41
42    /// The JSON:API `type` string this resource uses.
43    pub fn type_string(&self) -> &'static str {
44        match self {
45            ResourceType::Partition => "devices/partition",
46            ResourceType::Sensor => "devices/sensor",
47            ResourceType::Lock => "devices/lock",
48            ResourceType::GarageDoor => "devices/garageDoor",
49            ResourceType::Gate => "devices/gate",
50            ResourceType::Light => "devices/light",
51            ResourceType::Thermostat => "devices/thermostat",
52            ResourceType::Camera => "devices/camera",
53            ResourceType::WaterSensor => "devices/waterSensor",
54            ResourceType::WaterValve => "devices/waterValve",
55            ResourceType::System => "systems/system",
56            ResourceType::ImageSensor => "devices/imageSensor",
57        }
58    }
59}
60
61impl fmt::Display for ResourceType {
62    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
63        write!(f, "{:?}", self)
64    }
65}
66
67/// Common attributes shared by all managed devices.
68#[derive(Debug, Clone, Deserialize, Serialize)]
69#[serde(rename_all = "camelCase")]
70pub struct BaseDeviceAttributes {
71    #[serde(default)]
72    pub description: Option<String>,
73    #[serde(default)]
74    pub has_permission: Option<bool>,
75    #[serde(default)]
76    pub can_be_renamed: Option<bool>,
77    #[serde(default)]
78    pub can_be_saved: Option<bool>,
79    #[serde(default)]
80    pub can_access_web_settings: Option<bool>,
81    #[serde(default)]
82    pub can_access_app_settings: Option<bool>,
83    #[serde(default)]
84    pub mac_address: Option<String>,
85}
86
87/// A trait for types that represent a device with a name and ID.
88pub trait Device {
89    fn id(&self) -> &str;
90    fn name(&self) -> &str;
91    fn resource_type() -> ResourceType;
92}