use crate::{
assertion::{
traits::{Container, Equality},
types::Headers,
Assertion,
},
dsl::expression::Predicate,
header::{HeaderMap, HeaderName, HeaderValue},
LogSettings,
};
type HeadersVec = Vec<(HeaderName, HeaderValue)>;
type HeadersStrVec = Vec<(&'static str, &'static str)>;
pub trait HeadersDsl<T> {
fn is(&self, actual: T) -> Assertion<Headers>;
fn is_not(&self, actual: T) -> Assertion<Headers>;
fn contains(&self, actual: T) -> Assertion<Headers>;
fn does_not_contain(&self, actual: T) -> Assertion<Headers>;
fn eval(
&self,
actual: T,
predicate: Predicate,
log_settings: &LogSettings,
) -> Assertion<Headers> {
match predicate {
Predicate::Is => self.is(actual).assert(log_settings),
Predicate::IsNot => self.is_not(actual).assert(log_settings),
Predicate::Contains => self.contains(actual).assert(log_settings),
Predicate::DoesNotContain => self.does_not_contain(actual).assert(log_settings),
_ => unimplemented!("Invalid predicate for the headers DSL: {predicate}"),
}
}
}
impl HeadersDsl<HeaderMap> for HeaderMap {
fn is(&self, actual: HeaderMap) -> Assertion<Headers> {
actual.is_eq(self)
}
fn is_not(&self, actual: HeaderMap) -> Assertion<Headers> {
actual.is_ne(self)
}
fn contains(&self, actual: HeaderMap) -> Assertion<Headers> {
actual.has(self)
}
fn does_not_contain(&self, actual: HeaderMap) -> Assertion<Headers> {
actual.has_not(self)
}
}
impl HeadersDsl<HeaderMap> for HeadersVec {
fn is(&self, actual: HeaderMap) -> Assertion<Headers> {
actual.is_eq(self)
}
fn is_not(&self, actual: HeaderMap) -> Assertion<Headers> {
actual.is_ne(self)
}
fn contains(&self, actual: HeaderMap) -> Assertion<Headers> {
actual.has(self)
}
fn does_not_contain(&self, actual: HeaderMap) -> Assertion<Headers> {
actual.has_not(self)
}
}
impl HeadersDsl<HeaderMap> for HeadersStrVec {
fn is(&self, actual: HeaderMap) -> Assertion<Headers> {
actual.is_eq(self)
}
fn is_not(&self, actual: HeaderMap) -> Assertion<Headers> {
actual.is_ne(self)
}
fn contains(&self, actual: HeaderMap) -> Assertion<Headers> {
actual.has(self)
}
fn does_not_contain(&self, actual: HeaderMap) -> Assertion<Headers> {
actual.has_not(self)
}
}