seamapi_rs/
access_codes.rs1use 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}