use std::{collections::HashMap, time::Duration};
use ureq::Agent;
use crate::{ExitKind, ProgramExit, constant, http_client::api::HttpClient};
#[derive(Default)]
pub struct UreqHttpClient {
pub server_url: String,
}
pub struct MockHttpClient {
pub response: Result<String, ProgramExit>,
}
pub struct MockEndpointHttpClient<'a> {
pub response: HashMap<&'a str, Result<String, ProgramExit>>,
}
impl HttpClient for UreqHttpClient {
fn get(&self, url: &str) -> Result<String, ProgramExit> {
let full_url = format!("{}{url}", self.server_url);
let agent: Agent = Agent::config_builder()
.timeout_global(Some(Duration::from_secs(5)))
.build()
.into();
let result = agent.get(full_url).call();
match result {
Ok(mut response) => match response.body_mut().read_to_string() {
Ok(body) => Ok(body.trim().to_string()),
Err(_error) => Err(ProgramExit {
message: String::from(
constant::error_messages::BODY_PARSING_ISSUE,
),
exit_status: constant::exit_status::BODY_PARSING_ISSUE,
styled_message: None,
kind: ExitKind::Error,
}),
},
Err(error) => Err(ProgramExit {
message: constant::error_messages::API_CALL_FAILURE
.replace("{error}", &error.to_string()),
exit_status: constant::exit_status::GENERIC,
styled_message: None,
kind: ExitKind::Error,
}),
}
}
}
impl HttpClient for MockHttpClient {
fn get(&self, _url: &str) -> Result<String, ProgramExit> {
self.response.clone()
}
}
impl HttpClient for MockEndpointHttpClient<'_> {
fn get(&self, url: &str) -> Result<String, ProgramExit> {
self.response[url].clone()
}
}