use crate::error::Error;
#[derive(Debug)]
pub enum RetryResult {
Permanent(Error),
Exhausted(Error),
Continue(Error),
}
impl RetryResult {
pub fn is_permanent(&self) -> bool {
match &self {
Self::Permanent(_) => true,
Self::Exhausted(_) | Self::Continue(_) => false,
}
}
pub fn is_exhausted(&self) -> bool {
match &self {
Self::Exhausted(_) => true,
Self::Permanent(_) | Self::Continue(_) => false,
}
}
pub fn is_continue(&self) -> bool {
match &self {
Self::Continue(_) => true,
Self::Permanent(_) | Self::Exhausted(_) => false,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn loop_state() {
let flow = RetryResult::Permanent(permanent_error());
assert!(flow.is_permanent(), "{flow:?}");
assert!(!flow.is_exhausted(), "{flow:?}");
assert!(!flow.is_continue(), "{flow:?}");
let flow = RetryResult::Exhausted(transient_error());
assert!(!flow.is_permanent(), "{flow:?}");
assert!(flow.is_exhausted(), "{flow:?}");
assert!(!flow.is_continue(), "{flow:?}");
let flow = RetryResult::Continue(transient_error());
assert!(!flow.is_permanent(), "{flow:?}");
assert!(!flow.is_exhausted(), "{flow:?}");
assert!(flow.is_continue(), "{flow:?}");
}
fn permanent_error() -> Error {
use crate::error::rpc::*;
Error::service(Status::default().set_code(Code::PermissionDenied))
}
fn transient_error() -> Error {
use crate::error::rpc::*;
Error::service(Status::default().set_code(Code::Unavailable))
}
}