1#[cfg(feature = "blocking")]
5use std::io::Read;
6
7use crate::common::tmf_error::TMFError;
8use crate::{Config, QueryOptions};
9use serde::{de::DeserializeOwned, Serialize};
10use tmflib::HasId;
11use log::debug;
12#[cfg(feature = "tmf620")]
15pub mod tmf620;
16#[cfg(feature = "tmf622")]
17pub mod tmf622;
18#[cfg(feature = "tmf629")]
19pub mod tmf629;
20#[cfg(feature = "tmf632")]
21pub mod tmf632;
22#[cfg(feature = "tmf633")]
23pub mod tmf633;
24#[cfg(feature = "tmf637")]
25pub mod tmf637;
26#[cfg(feature = "tmf638")]
27pub mod tmf638;
28#[cfg(feature = "tmf639")]
29pub mod tmf639;
30#[cfg(feature = "tmf645")]
31pub mod tmf645;
32#[cfg(feature = "tmf648")]
33pub mod tmf648;
34#[cfg(feature = "tmf663")]
35pub mod tmf663;
36#[cfg(feature = "tmf674")]
37pub mod tmf674;
38
39static USER_AGENT: &str = concat!(env!("CARGO_PKG_NAME"), "/", env!("CARGO_PKG_VERSION"));
40
41fn gen_url(config: &Config) -> String {
42 format!("{}:{}", config.host, config.port)
44}
45
46#[cfg(feature = "blocking")]
48pub fn get_tmf<T: HasId + DeserializeOwned>(
49 config: &Config,
50 id: String,
51) -> Result<Vec<T>, TMFError> {
52 let url = format!("{}{}/{}", gen_url(config), T::get_class_href(), id);
54
55 let client = reqwest::blocking::Client::builder()
56 .danger_accept_invalid_certs(config.insecure) .user_agent(USER_AGENT)
58 .use_rustls_tls()
59 .build()?;
60
61 let objects = client.get(url).send()?.text()?;
62 let output: T = serde_json::from_str(objects.as_str())?;
63 Ok(vec![output])
64}
65
66#[cfg(not(feature = "blocking"))]
68pub async fn get_tmf<T: HasId + DeserializeOwned>(
69 config: &Config,
70 id: String,
71) -> Result<Vec<T>, TMFError> {
72 let url = format!("{}{}/{}", gen_url(config), T::get_class_href(), id);
74
75 let client = reqwest::Client::builder()
76 .danger_accept_invalid_certs(config.insecure) .user_agent(USER_AGENT)
78 .use_rustls_tls()
79 .build()?;
80
81 let objects = client.get(url).send().await?.text().await?;
82 let output: T = serde_json::from_str(objects.as_str())?;
83 Ok(vec![output])
84}
85
86#[cfg(feature = "blocking")]
88pub fn list_tmf<T: HasId + DeserializeOwned>(
89 config: &Config,
90 filter: Option<QueryOptions>,
91) -> Result<Vec<T>, TMFError> {
92 let filter = match filter {
94 Some(f) => f.into(),
95 None => String::default(),
96 };
97 print!("Generating url...");
98 let url = format!("{}{}?{}", gen_url(config), T::get_class_href(), filter);
99 println!("Done! [{url}]");
100
101 let client = reqwest::blocking::Client::builder()
102 .danger_accept_invalid_certs(config.insecure) .user_agent(USER_AGENT)
104 .use_rustls_tls()
105 .build()?;
106 debug!("testing url: {url}");
107 let objects = client.get(url).send()?.text()?;
108 let output: Vec<T> = serde_json::from_str(objects.as_str())?;
109 Ok(output)
110}
111
112#[cfg(not(feature = "blocking"))]
114pub async fn list_tmf<T: HasId + DeserializeOwned>(
115 config: &Config,
116 filter: Option<QueryOptions>,
117) -> Result<Vec<T>, TMFError> {
118 let filter = match filter {
120 Some(f) => f.into(),
121 None => String::default(),
122 };
123 let url = format!("{}{}?{}", gen_url(config), T::get_class_href(), filter);
124
125 let client = reqwest::Client::builder()
126 .danger_accept_invalid_certs(config.insecure) .user_agent(USER_AGENT)
128 .use_rustls_tls()
129 .build()?;
130
131 let objects = client.get(url).send().await?.text().await?;
132 let output: Vec<T> = serde_json::from_str(objects.as_str())?;
133 Ok(output)
134}
135
136#[cfg(feature = "blocking")]
138pub fn create_tmf<T: HasId + Serialize + DeserializeOwned>(
139 config: &Config,
140 item: T,
141) -> Result<T, TMFError> {
142 let url = format!("{}{}", gen_url(config), T::get_class_href());
143
144 let client = reqwest::blocking::Client::builder()
145 .danger_accept_invalid_certs(config.insecure) .use_rustls_tls()
147 .user_agent(USER_AGENT)
148 .build()?;
149 let body_str = serde_json::to_string(&item)?;
150 let mut res = client.post(url).body(body_str).send()?;
151 let mut output = String::default();
152 let _count = res.read_to_string(&mut output)?;
153 match res.status() {
154 reqwest::StatusCode::CREATED | reqwest::StatusCode::OK => {
155 let item: T = serde_json::from_str(output.as_str())?;
156 Ok(item)
157 }
158 _ => Err(TMFError::Unknown(format!(
159 "Failed to create TMF object: {output}"
160 ))),
161 }
162}
163
164#[cfg(not(feature = "blocking"))]
166pub async fn create_tmf<T: HasId + Serialize + DeserializeOwned>(
167 config: &Config,
168 item: T,
169) -> Result<T, TMFError> {
170 let url = format!("{}{}", gen_url(config), T::get_class_href());
171
172 let client = reqwest::Client::builder()
173 .danger_accept_invalid_certs(config.insecure) .use_rustls_tls()
175 .user_agent(USER_AGENT)
176 .build()?;
177 let body_str = serde_json::to_string(&item)?;
178 let res = client.post(url).body(body_str).send().await?;
179 let status = res.status();
182 let output = res.text().await?;
183 match status {
184 reqwest::StatusCode::CREATED | reqwest::StatusCode::OK => {
185 let item: T = serde_json::from_str(output.as_str())?;
186 Ok(item)
187 }
188 _ => Err(TMFError::Unknown(format!(
189 "Failed to create TMF object: {output}"
190 ))),
191 }
192}
193
194#[cfg(feature = "blocking")]
196pub fn update_tmf<T: HasId + Serialize + DeserializeOwned>(
197 config: &Config,
198 id: impl Into<String>,
199 patch: T,
200) -> Result<T, TMFError> {
201 let url = format!("{}{}/{}", gen_url(config), T::get_class_href(), id.into());
202
203 let client = reqwest::blocking::Client::builder()
204 .danger_accept_invalid_certs(config.insecure) .use_rustls_tls()
206 .user_agent(USER_AGENT)
207 .build()?;
208
209 let body_str = serde_json::to_string(&patch)?;
210 let mut res = client.patch(url).body(body_str).send()?;
211 let mut output = String::default();
212 let _ = res.read_to_string(&mut output);
213 let item: T = serde_json::from_str(output.as_str())?;
214 Ok(item)
215}
216
217#[cfg(not(feature = "blocking"))]
219pub async fn update_tmf<T: HasId + Serialize + DeserializeOwned>(
220 config: &Config,
221 id: impl Into<String>,
222 patch: T,
223) -> Result<T, TMFError> {
224 let url = format!("{}{}/{}", gen_url(config), T::get_class_href(), id.into());
225
226 let client = reqwest::Client::builder()
227 .danger_accept_invalid_certs(config.insecure) .use_rustls_tls()
229 .user_agent(USER_AGENT)
230 .build()?;
231
232 let body_str = serde_json::to_string(&patch)?;
233 let res = client.patch(url).body(body_str).send().await?;
234 let item: T = serde_json::from_str(res.text().await?.as_str())?;
237 Ok(item)
238}
239
240#[cfg(feature = "blocking")]
242pub fn delete_tmf<T: HasId>(config: &Config, id: impl Into<String>) -> Result<T, TMFError> {
243 let url = format!(
244 "{}{}/{}",
245 gen_url(config),
246 T::get_class_href(),
247 id.into().clone()
248 );
249
250 let client = reqwest::blocking::Client::builder()
251 .danger_accept_invalid_certs(config.insecure) .use_rustls_tls()
253 .user_agent(USER_AGENT)
254 .build()?;
255
256 let mut _res = client.delete(url).send()?;
257 let out = T::default();
260 Ok(out)
262}
263
264#[cfg(not(feature = "blocking"))]
266pub async fn delete_tmf<T: HasId>(config: &Config, id: impl Into<String>) -> Result<T, TMFError> {
267 let url = format!(
268 "{}{}/{}",
269 gen_url(config),
270 T::get_class_href(),
271 id.into().clone()
272 );
273
274 let client = reqwest::Client::builder()
275 .danger_accept_invalid_certs(config.insecure) .use_rustls_tls()
277 .user_agent(USER_AGENT)
278 .build()?;
279
280 let mut _res = client.delete(url).send().await?;
281 let out = T::default();
284 Ok(out)
286}