seamapi_rs/
access_codes.rs

1use anyhow::{bail, Context, Result};
2use serde::{Deserialize, Serialize};
3
4pub struct AccessCodes(pub String, pub String);
5
6#[derive(Serialize, Deserialize, Clone, Debug)]
7pub struct AccessCode {
8    pub code: String,
9    #[serde(rename = "type")]
10    pub type_field: String,
11    pub status: String,
12    pub created_at: String,
13    pub access_code_id: String,
14}
15
16impl AccessCodes {
17    pub fn list(self, device_id: String) -> Result<Vec<AccessCode>> {
18        let url = format!("{}/access_codes/list?device_id={}", self.1, device_id);
19        let header = format!("Bearer {}", self.0);
20
21        let req = reqwest::blocking::Client::new()
22            .get(url)
23            .header("Authorization", header)
24            .send()
25            .context("Failed to send get request")?;
26
27        if req.status() == reqwest::StatusCode::NOT_FOUND {
28            bail!("device not found");
29        } else if req.status() != reqwest::StatusCode::OK {
30            bail!("{}", req.text().context("Really bad API failure")?);
31        }
32
33        let json: crate::Response = req.json().context("Failed to deserialize JSON")?;
34        Ok(json.access_codes.unwrap())
35    }
36
37    pub fn get(self, access_code_id: String) -> Result<AccessCode> {
38        let url = format!(
39            "{}/access_codes/get?access_code_id={}",
40            self.1, access_code_id
41        );
42        let header = format!("Bearer {}", self.0);
43
44        let req = reqwest::blocking::Client::new()
45            .get(url)
46            .header("Authorization", header)
47            .send()
48            .context("Failed to send get request")?;
49
50        if req.status() == reqwest::StatusCode::NOT_FOUND {
51            bail!("device not found");
52        } else if req.status() != reqwest::StatusCode::OK {
53            bail!("{}", req.text().context("Really bad API failure")?);
54        }
55        let json: crate::Response = req.json().context("Failed to deserialize JSON")?;
56        Ok(json.access_code.unwrap())
57    }
58
59    pub fn create(
60        self,
61        device: String,
62        name: Option<String>,
63        code: Option<String>,
64        starts_at: Option<String>,
65        ends_at: Option<String>,
66    ) -> Result<crate::action_attempts::ActionAttempt> {
67        let url = format!("{}/access_codes/create", self.1);
68        let header = format!("Bearer {}", self.0);
69
70        let mut map = std::collections::HashMap::new();
71        map.insert("device_id", device);
72        if name != None {
73            map.insert("name", name.unwrap());
74        }
75        if code != None {
76            map.insert("code", code.unwrap());
77        }
78        if starts_at != None {
79            map.insert("starts_at", starts_at.unwrap());
80        }
81        if ends_at != None {
82            map.insert("ends_at", ends_at.unwrap());
83        }
84
85        let req = reqwest::blocking::Client::new()
86            .post(url)
87            .header("Authorization", header)
88            .json(&map)
89            .send()
90            .context("Failed to send post request")?;
91        if req.status() == reqwest::StatusCode::NOT_FOUND {
92            bail!("device not found");
93        } else if req.status() != reqwest::StatusCode::OK {
94            bail!("{}", req.text().context("Really bad API error")?);
95        }
96
97        let json: crate::Response = req.json().context("Failed to deserialize JSON")?;
98        Ok(json.action_attempt.unwrap())
99    }
100
101    pub fn delete(self, access_code_id: String) -> Result<crate::action_attempts::ActionAttempt> {
102        let url = format!(
103            "{}/access_codes/delete?access_code_id={}",
104            self.1, access_code_id
105        );
106        let header = format!("Bearer {}", self.0);
107
108        let req = reqwest::blocking::Client::new()
109            .delete(url)
110            .header("Authorization", header)
111            .send()
112            .context("Failed to send delete request")?;
113
114        if req.status() == reqwest::StatusCode::NOT_FOUND {
115            bail!("access code not found");
116        } else if req.status() != reqwest::StatusCode::OK {
117            bail!("{}", req.text().context("Really bad API error")?);
118        }
119
120        let json: crate::Response = req.json().context("Failed to deserialize JSON")?;
121        Ok(json.action_attempt.unwrap())
122    }
123
124    pub fn update(
125        self,
126        access_code_id: String,
127        name: Option<String>,
128        code: Option<String>,
129        starts_at: Option<String>,
130        ends_at: Option<String>,
131    ) -> Result<crate::action_attempts::ActionAttempt> {
132        let url = format!("{}/access_codes/update", self.1);
133        let header = format!("Bearer {}", self.0);
134
135        let mut map = std::collections::HashMap::new();
136        map.insert("access_code_id", access_code_id);
137        if name != None {
138            map.insert("name", name.unwrap());
139        }
140        if code != None {
141            map.insert("code", code.unwrap());
142        }
143        if starts_at != None {
144            map.insert("starts_at", starts_at.unwrap());
145        }
146        if ends_at != None {
147            map.insert("ends_at", ends_at.unwrap());
148        }
149
150        let req = reqwest::blocking::Client::new()
151            .put(url)
152            .header("Authorization", header)
153            .json(&map)
154            .send()
155            .context("failed to send put request")?;
156
157        if req.status() != reqwest::StatusCode::OK {
158            bail!("{}", req.text().context("Really bad API error")?);
159        }
160
161        let json: crate::Response = req.json().context("Failed to deserialize JSON")?;
162        Ok(json.action_attempt.unwrap())
163    }
164}