use df_elysium_core::client::{Response, TransportError};
use super::{Answer, Chain, Node};
pub(super) struct Failure {
chain: Chain,
method: Option<String>,
answer: Answer,
}
impl Node {
#[must_use]
pub fn status(self, chain: Chain, method: Option<&str>, status: u16, body: &str) -> Node {
let answer = Ok(Response { status, headers: Vec::new(), body: body.as_bytes().to_vec() });
self.failing(chain, method, answer)
}
#[must_use]
pub fn retry_after(self, chain: Chain, seconds: u64) -> Node {
let headers = vec![("Retry-After".to_owned(), seconds.to_string())];
self.failing(chain, None, Ok(Response { status: 429, headers, body: b"null".to_vec() }))
}
#[must_use]
pub fn unreachable(self, chain: Chain, method: Option<&str>) -> Node {
self.failing(chain, method, Err(TransportError::Unreachable("the connection was reset".to_owned())))
}
fn failing(self, chain: Chain, method: Option<&str>, answer: Answer) -> Node {
self.failures.borrow_mut().push_back(Failure { chain, method: method.map(str::to_owned), answer });
self
}
pub(super) fn failure(&self, chain: Chain, method: &str) -> Option<Answer> {
let mut failures = self.failures.borrow_mut();
let at = failures
.iter()
.position(|failure| failure.chain == chain && failure.method.as_deref().is_none_or(|one| one == method))?;
failures.remove(at).map(|failure| failure.answer)
}
}