use crate::{
assertion::{
traits::{Equality, RangeInclusive},
Assertion,
},
dsl::{is_between, Expression, Predicate, Range},
grillon::LogSettings,
StatusCode,
};
pub fn is_success() -> Expression<Range<u16>> {
is_between(200, 299)
}
pub fn is_client_error() -> Expression<Range<u16>> {
is_between(400, 499)
}
pub fn is_server_error() -> Expression<Range<u16>> {
is_between(500, 599)
}
pub trait StatusCodeDsl<T> {
fn eval(&self, actual: T, predicate: Predicate, log_settings: &LogSettings) -> Assertion<u16>;
}
impl StatusCodeDsl<StatusCode> for StatusCode {
fn eval(
&self,
actual: StatusCode,
predicate: Predicate,
log_settings: &LogSettings,
) -> Assertion<u16> {
match predicate {
Predicate::Is => self.is(actual).assert(log_settings),
Predicate::IsNot => self.is_not(actual).assert(log_settings),
_ => unimplemented!("Invalid predicate for the status code DSL: {predicate}"),
}
}
}
impl StatusCodeDsl<StatusCode> for u16 {
fn eval(
&self,
actual: StatusCode,
predicate: Predicate,
log_settings: &LogSettings,
) -> Assertion<u16> {
match predicate {
Predicate::Is => self.is(actual).assert(log_settings),
Predicate::IsNot => self.is_not(actual).assert(log_settings),
_ => unimplemented!("Invalid predicate for the status code DSL: {predicate}"),
}
}
}
impl StatusCodeDsl<StatusCode> for Range<StatusCode> {
fn eval(
&self,
actual: StatusCode,
predicate: Predicate,
log_settings: &LogSettings,
) -> Assertion<u16> {
match predicate {
Predicate::Between => self.is_between(actual).assert(log_settings),
_ => unimplemented!("Invalid predicate for the status code DSL: {predicate}"),
}
}
}
impl StatusCodeDsl<StatusCode> for Range<u16> {
fn eval(
&self,
actual: StatusCode,
predicate: Predicate,
log_settings: &LogSettings,
) -> Assertion<u16> {
match predicate {
Predicate::Between => self.is_between(actual).assert(log_settings),
_ => unimplemented!("Invalid predicate for the status code DSL: {predicate}"),
}
}
}
pub trait StatusCodeDslEquality<T>: StatusCodeDsl<T> {
fn is(&self, actual: T) -> Assertion<u16>;
fn is_not(&self, actual: T) -> Assertion<u16>;
}
impl StatusCodeDslEquality<StatusCode> for StatusCode {
fn is(&self, actual: StatusCode) -> Assertion<u16> {
actual.is_eq(self)
}
fn is_not(&self, actual: StatusCode) -> Assertion<u16> {
actual.is_ne(self)
}
}
impl StatusCodeDslEquality<StatusCode> for u16 {
fn is(&self, actual: StatusCode) -> Assertion<u16> {
actual.is_eq(self)
}
fn is_not(&self, actual: StatusCode) -> Assertion<u16> {
actual.is_ne(self)
}
}
pub trait StatusCodeDslBetween<T>: StatusCodeDsl<T> {
fn is_between(&self, actual: T) -> Assertion<u16>;
}
impl StatusCodeDslBetween<StatusCode> for Range<StatusCode> {
fn is_between(&self, actual: StatusCode) -> Assertion<u16> {
actual.in_range(&self.left, &self.right)
}
}
impl StatusCodeDslBetween<StatusCode> for Range<u16> {
fn is_between(&self, actual: StatusCode) -> Assertion<u16> {
actual.in_range(&self.left, &self.right)
}
}