use recoverable::RecoveryInfo;
use crate::HttpRequest;
#[derive(Debug, Clone)]
pub struct RouterContext<'a> {
attempt: u32,
is_last_attempt: bool,
previous_recovery: Option<RecoveryInfo>,
request: Option<&'a HttpRequest>,
}
impl Default for RouterContext<'_> {
fn default() -> Self {
Self {
attempt: 0,
is_last_attempt: true,
previous_recovery: None,
request: None,
}
}
}
impl<'a> RouterContext<'a> {
#[must_use]
pub fn new() -> Self {
Self::default()
}
#[must_use]
pub fn with_request(mut self, request: &'a HttpRequest) -> Self {
self.request = Some(request);
self
}
#[must_use]
pub fn with_attempt(mut self, attempt: u32, is_last_attempt: bool) -> Self {
self.attempt = attempt;
self.is_last_attempt = is_last_attempt;
self
}
#[must_use]
pub fn with_previous_recovery(mut self, previous_recovery: RecoveryInfo) -> Self {
self.previous_recovery = Some(previous_recovery);
self
}
#[must_use]
pub fn attempt(&self) -> u32 {
self.attempt
}
#[must_use]
pub fn is_last_attempt(&self) -> bool {
self.is_last_attempt
}
#[must_use]
pub fn previous_recovery(&self) -> Option<&RecoveryInfo> {
self.previous_recovery.as_ref()
}
#[must_use]
pub fn request(&self) -> Option<&'a HttpRequest> {
self.request
}
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use super::*;
use crate::HttpRequestBuilder;
#[test]
fn defaults() {
let ctx = RouterContext::new();
assert_eq!(ctx.attempt(), 0);
assert!(ctx.is_last_attempt());
assert!(ctx.previous_recovery().is_none());
assert!(ctx.request().is_none());
let _ = format!("{:?}", ctx.clone());
}
#[test]
fn with_setters() {
let request = HttpRequestBuilder::new_fake()
.get("https://example.com/")
.build()
.expect("valid request");
let recovery = RecoveryInfo::retry();
let ctx = RouterContext::new()
.with_request(&request)
.with_attempt(2, true)
.with_previous_recovery(recovery);
assert_eq!(ctx.attempt(), 2);
assert!(ctx.is_last_attempt());
assert!(ctx.previous_recovery().is_some());
assert!(ctx.request().is_some());
}
#[test]
fn with_attempt_can_set_is_last_attempt_to_false() {
let ctx = RouterContext::new().with_attempt(1, false);
assert_eq!(ctx.attempt(), 1);
assert!(!ctx.is_last_attempt());
}
}