Skip to main content

tmf_client/tmf/
mod.rs

1//! TMF Modules
2//!
3
4#[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// use log::info;
13
14#[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    // println!("Host: {}, Port: {}", config.host, config.port);
43    format!("{}:{}", config.host, config.port)
44}
45
46/// Make API call to retrieve a single TMF object
47#[cfg(feature = "blocking")]
48pub fn get_tmf<T: HasId + DeserializeOwned>(
49    config: &Config,
50    id: String,
51) -> Result<Vec<T>, TMFError> {
52    // Return results
53    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) // For testing purposes only, do not use in production
57        .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/// Get a single TMF record
67#[cfg(not(feature = "blocking"))]
68pub async fn get_tmf<T: HasId + DeserializeOwned>(
69    config: &Config,
70    id: String,
71) -> Result<Vec<T>, TMFError> {
72    // Return results
73    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) // For testing purposes only, do not use in production
77        .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/// Make API call to retrieve a set of TMF objects according to filter
87#[cfg(feature = "blocking")]
88pub fn list_tmf<T: HasId + DeserializeOwned>(
89    config: &Config,
90    filter: Option<QueryOptions>,
91) -> Result<Vec<T>, TMFError> {
92    // Return results
93    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) // For testing purposes only, do not use in production
103        .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/// List TMF records , optionally apply a filter
113#[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    // Return results
119    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) // For testing purposes only, do not use in production
127        .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/// Create a new TMF object
137#[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) // For testing purposes only, do not use in production
146        .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/// Create a new TMF record
165#[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) // For testing purposes only, do not use in production
174        .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 mut output = String::default();
180    // let _count = res.read_to_string(&mut output)?;
181    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/// Update an existing TMF object
195#[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) // For testing purposes only, do not use in production
205        .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/// Update a TMF record
218#[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) // For testing purposes only, do not use in production
228        .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 mut output = String::default();
235    // let _ = res.read_to_string(&mut output);
236    let item: T = serde_json::from_str(res.text().await?.as_str())?;
237    Ok(item)
238}
239
240/// Delete an existing TMF object
241#[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) // For testing purposes only, do not use in production
252        .use_rustls_tls()
253        .user_agent(USER_AGENT)
254        .build()?;
255
256    let mut _res = client.delete(url).send()?;
257    // Return empty object for now to avoid
258    // round trip to retrieve object
259    let out = T::default();
260    // out.set_id(id);
261    Ok(out)
262}
263
264/// Delete a single TMF record, returning deleted record
265#[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) // For testing purposes only, do not use in production
276        .use_rustls_tls()
277        .user_agent(USER_AGENT)
278        .build()?;
279
280    let mut _res = client.delete(url).send().await?;
281    // Return empty object for now to avoid
282    // round trip to retrieve object
283    let out = T::default();
284    // out.set_id(id);
285    Ok(out)
286}