#[cfg(feature = "async_mode")]
use curl::easy::{Easy2, Handler, WriteError};
#[cfg(feature = "async_mode")]
use crate::error::ReturnError;
#[cfg(feature = "async_mode")]
struct Collector(Vec<u8>);
#[cfg(feature = "async_mode")]
impl Handler for Collector {
fn write(&mut self, data: &[u8]) -> Result<usize, WriteError> {
self.0.extend_from_slice(data);
Ok(data.len())
}
}
#[cfg(feature = "async_mode")]
pub(crate) fn do_request(url_format: &str) -> Result<String, ReturnError> {
let mut handle = Easy2::new(Collector(Vec::new()));
if let Err(_) = handle.get(true) {
return Err(ReturnError::UnableToRequest)
}
if let Err(_) = handle.url(url_format) {
return Err(ReturnError::UnableToSetUrl);
}
let mut perform_result;
for element in 0..3 {
perform_result = handle.perform();
if perform_result.is_ok() { break; }
if element != 2 { continue; }
return Err(ReturnError::FailedToApplyRequest);
}
match handle.response_code() {
Ok(number) => {
if number != 200 {
return Err(ReturnError::RequestDenied)
}
},
Err(_) => return Err(ReturnError::NotFound),
}
let contents = handle.get_ref();
let response = String::from_utf8_lossy(&contents.0);
Ok(response.to_string())
}