eskom_se_push_api/
ureq_client.rs1use serde::de::DeserializeOwned;
7
8use crate::{
9 allowance::{AllowanceCheck, AllowanceCheckURL},
10 area_info::{AreaInfo, AreaInfoURLBuilder},
11 area_nearby::{AreaNearby, AreasNearbyURLBuilder},
12 area_search::{AreaSearch, AreaSearchURLBuilder},
13 errors::{APIError, HttpError},
14 get_token_from_env,
15 status::{EskomStatus, EskomStatusUrl},
16 topics_nearby::{TopicsNearby, TopicsNearbyUrlBuilder},
17 Endpoint,
18};
19
20pub struct UreqClient {
21 token: String,
22}
23
24impl UreqClient {
25 pub fn new(token: String) -> Self {
28 UreqClient { token }
29 }
30
31 pub fn new_with_env(var_name: Option<&str>) -> Self {
36 match get_token_from_env(var_name) {
37 Ok(val) => UreqClient { token: val },
38 Err(e) => panic!("Error: {}", e),
39 }
40 }
41
42 pub fn get_load_shedding_status(&self) -> Result<EskomStatus, HttpError> {
46 let c = EskomStatusUrl::default();
47 c.ureq(&self.token)
48 }
49
50 pub fn get_area_info(&self, area_id: &str) -> Result<AreaInfo, HttpError> {
52 let t = AreaInfoURLBuilder::default()
53 .area_id(area_id.to_owned())
54 .build()
55 .map_err(|_| HttpError::AreaIdNotSet)?;
56 t.ureq(&self.token)
57 }
58
59 pub fn areas_nearby(&self, lat: f32, long: f32) -> Result<AreaNearby, HttpError> {
62 let t = AreasNearbyURLBuilder::default()
63 .latitude(lat)
64 .longitude(long)
65 .build()
66 .map_err(|_| HttpError::LongitudeOrLatitudeNotSet {
67 longitude: lat,
68 latitude: long,
69 })?;
70 t.ureq(&self.token)
71 }
72
73 pub fn areas_search(&self, search_term: &str) -> Result<AreaSearch, HttpError> {
75 let t = AreaSearchURLBuilder::default()
76 .search_term(search_term)
77 .build()
78 .map_err(|_| HttpError::SearchTextNotSet)?;
79 t.ureq(&self.token)
80 }
81
82 pub fn topics_nearby(&self, lat: f32, long: f32) -> Result<TopicsNearby, HttpError> {
84 let t = TopicsNearbyUrlBuilder::default()
85 .latitude(lat)
86 .longitude(long)
87 .build()
88 .map_err(|_| HttpError::LongitudeOrLatitudeNotSet {
89 longitude: lat,
90 latitude: long,
91 })?;
92 t.ureq(&self.token)
93 }
94
95 pub fn check_allowance(&self) -> Result<AllowanceCheck, HttpError> {
98 let t = AllowanceCheckURL::default();
99 t.ureq(&self.token)
100 }
101}
102
103pub fn handle_ureq_response<T: DeserializeOwned>(
114 response: Result<ureq::Response, ureq::Error>,
115) -> Result<T, HttpError> {
116 match response {
117 Ok(resp) => resp
118 .into_json::<T>()
119 .map_err(|e| HttpError::UnknownError(e.to_string())),
120 Err(ureq::Error::Status(code, response)) => match code {
121 400 => Err(HttpError::APIError(APIError::BadRequest)),
122 403 => Err(HttpError::APIError(APIError::Forbidden)),
123 404 => Err(HttpError::APIError(APIError::NotFound)),
124 429 => Err(HttpError::APIError(APIError::TooManyRequests)),
125 500..=509 => Err(HttpError::APIError(APIError::ServerError(
126 response.into_string().unwrap(),
127 ))),
128 _a => Err(HttpError::Unknown),
129 },
130 Err(_) => Err(HttpError::NoInternet),
131 }
132}