use reqwest::{
header::{HeaderMap, HeaderName, HeaderValue},
ClientBuilder,
};
use crate::{
common::{
builder::{builder_options::BuilderOptions, error::BuilderError},
cobbler::Cobbler,
error::Error,
traits::backend_builder_trait_async::BackendBuilderTraitAsync,
},
error::{
payload::{events::Event, notifier::Notifier, Payload},
reqwest::client::non_blocking::ReqwestErrorAsync,
},
};
pub struct ClientBuilderReqwestErrorAsync {
pub client_builder: ClientBuilder,
pub(crate) options: BuilderOptions,
pub(crate) api_key: Option<String>,
pub(crate) payload_version: String,
pub(crate) notifier: Option<Notifier>,
pub(crate) events: Option<Vec<Event>>,
}
impl BackendBuilderTraitAsync<ReqwestErrorAsync, Error>
for ClientBuilderReqwestErrorAsync
{
fn build(mut self) -> Result<ReqwestErrorAsync, Error> {
let mut missing_fields: Vec<String> = Vec::new();
let headers = self.options.headers.as_mut().unwrap();
if self.api_key.is_some() {
headers.insert(
"Bugsnag-Api-Key".to_string(),
self.api_key.clone().unwrap(),
);
}
headers.insert(
"Bugsnag-Payload-Version".into(),
self.payload_version.clone(),
);
if !headers.contains_key("Bugsnag-Api-Key") {
missing_fields.push("api_key".to_string());
}
if self.notifier.is_none() {
missing_fields.push("notifier".to_string());
}
if self.events.is_none() {
missing_fields.push("events".to_string());
}
if missing_fields.len() == 0 {
let client = self
.client_builder
.default_headers(
self.options
.headers
.as_ref()
.unwrap()
.into_iter()
.map(|(header_name, header_value)| {
(
HeaderName::from_bytes(header_name.as_bytes())
.unwrap(),
HeaderValue::from_str(&header_value).unwrap(),
)
})
.collect::<HeaderMap>(),
)
.build()?;
let payload = Payload {
api_key: self.api_key,
payload_version: self.payload_version,
notifier: self.notifier.unwrap(),
events: self.events.unwrap(),
};
let url = Cobbler::cobble(self.options)?;
Ok(ReqwestErrorAsync { url, client, payload })
} else {
Err(BuilderError::MissingField {
context: "BackendBuilderTrait<ReqwestErrorAsync, Error>"
.to_string(),
fields: missing_fields,
}
.into())
}
}
}