use super::event_channel;
use super::BackgroundTask;
use super::BackgroundTaskController;
use super::Error;
use super::ErrorI;
use super::FormattedLabels;
use super::Layer;
use std::collections::hash_map;
use std::collections::HashMap;
use url::Url;
pub fn builder() -> Builder {
let mut http_headers = reqwest::header::HeaderMap::new();
http_headers.insert(
reqwest::header::CONTENT_TYPE,
reqwest::header::HeaderValue::from_static("application/x-protobuf"),
);
http_headers.insert(
reqwest::header::CONTENT_ENCODING,
reqwest::header::HeaderValue::from_static("snappy"),
);
Builder {
labels: FormattedLabels::new(),
extra_fields: HashMap::new(),
http_headers,
}
}
#[derive(Clone)]
pub struct Builder {
labels: FormattedLabels,
extra_fields: HashMap<String, String>,
http_headers: reqwest::header::HeaderMap,
}
impl Builder {
pub fn label<S: Into<String>, T: AsRef<str>>(
mut self,
key: S,
value: T,
) -> Result<Builder, Error> {
self.labels.add(key.into(), value.as_ref())?;
Ok(self)
}
pub fn extra_field<S: Into<String>, T: Into<String>>(
mut self,
key: S,
value: T,
) -> Result<Builder, Error> {
match self.extra_fields.entry(key.into()) {
hash_map::Entry::Occupied(o) => {
return Err(Error(ErrorI::DuplicateExtraField(o.key().clone())));
}
hash_map::Entry::Vacant(v) => {
v.insert(value.into());
}
}
Ok(self)
}
pub fn http_header<S: AsRef<str>, T: AsRef<str>>(
mut self,
key: S,
value: T,
) -> Result<Builder, Error> {
let key = key.as_ref();
let value = value.as_ref();
if self
.http_headers
.insert(
reqwest::header::HeaderName::from_bytes(key.as_bytes())
.map_err(|_| Error(ErrorI::InvalidHttpHeaderName(key.into())))?,
reqwest::header::HeaderValue::from_str(value)
.map_err(|_| Error(ErrorI::InvalidHttpHeaderValue(key.into())))?,
)
.is_some()
{
return Err(Error(ErrorI::DuplicateHttpHeader(key.into())));
}
Ok(self)
}
pub fn build_url(self, loki_url: Url) -> Result<(Layer, BackgroundTask), Error> {
let (sender, receiver) = event_channel();
Ok((
Layer {
sender,
extra_fields: self.extra_fields,
},
BackgroundTask::new(loki_url, self.http_headers, receiver, &self.labels)?,
))
}
pub fn build_controller_url(
self,
loki_url: Url,
) -> Result<(Layer, BackgroundTaskController, BackgroundTask), Error> {
let (sender, receiver) = event_channel();
Ok((
Layer {
sender: sender.clone(),
extra_fields: self.extra_fields,
},
BackgroundTaskController { sender },
BackgroundTask::new(loki_url, self.http_headers, receiver, &self.labels)?,
))
}
}