use std::collections::HashMap;
use serde::Serialize;
#[derive(Clone, Debug, Default, Serialize, Eq, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct Request {
pub client_ip: Option<String>,
pub headers: Option<HashMap<String, String>>,
pub http_method: Option<String>,
pub url: Option<String>,
pub referer: Option<String>,
}
#[cfg_attr(docsrs, doc(cfg(feature = "optional-builders")))]
#[cfg(feature = "optional-builders")]
impl Request {
pub fn builder() -> RequestBuilder {
RequestBuilder::default()
}
}
#[cfg_attr(docsrs, doc(cfg(feature = "optional-builders")))]
#[cfg(feature = "optional-builders")]
#[derive(Default)]
pub struct RequestBuilder {
request: Request,
}
#[cfg_attr(docsrs, doc(cfg(feature = "optional-builders")))]
#[cfg(feature = "optional-builders")]
impl RequestBuilder {
pub fn set_client_ip<'a>(
&mut self,
client_ip: impl Into<Option<&'a str>>,
) -> &mut Self {
self.request.client_ip = client_ip.into().map(|item| item.into());
self
}
pub fn set_headers<'a>(
&mut self,
headers: impl Into<Option<HashMap<String, String>>>,
) -> &mut Self {
self.request.headers = headers.into();
self
}
pub fn set_http_method<'a>(
&mut self,
http_method: impl Into<Option<&'a str>>,
) -> &mut Self {
self.request.http_method = http_method.into().map(|item| item.into());
self
}
pub fn set_url<'a>(
&mut self,
url: impl Into<Option<&'a str>>,
) -> &mut Self {
self.request.url = url.into().map(|item| item.into());
self
}
pub fn set_referer<'a>(
&mut self,
referer: impl Into<Option<&'a str>>,
) -> &mut Self {
self.request.referer = referer.into().map(|item| item.into());
self
}
pub fn build(&self) -> Request {
self.request.clone()
}
}
#[cfg(test)]
mod test {
#[cfg(feature = "optional-builders")]
#[test]
pub fn test_error_payload_events_request_builder() {
use crate::error::payload::events::Request;
use std::collections::HashMap;
let test_headers: HashMap<String, String> =
[("Header-name".to_string(), "Header value".to_string())].into();
let test_request = Request {
client_ip: "Client IP".to_string().into(),
headers: test_headers.into(),
http_method: "Http Method".to_string().into(),
url: "Url".to_string().into(),
referer: "".to_string().into(),
};
let mut request_builder = Request::builder();
request_builder
.set_client_ip(test_request.client_ip.clone().as_deref())
.set_headers(test_request.headers.clone())
.set_http_method(test_request.http_method.clone().as_deref())
.set_referer(test_request.referer.clone().as_deref())
.set_url(test_request.url.clone().as_deref());
let request = request_builder.build();
assert_eq!(test_request, request);
}
}