use nodedb_types::sync::wire::array::{ArrayRejectClass, ArrayRejectReason};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RejectDisposition {
ResendSchema,
CatchUp,
Drop,
Park,
}
pub fn reject_disposition(reason: ArrayRejectReason) -> RejectDisposition {
match reason.class() {
ArrayRejectClass::SchemaRequired => RejectDisposition::ResendSchema,
ArrayRejectClass::CatchUp => RejectDisposition::CatchUp,
ArrayRejectClass::Permanent => RejectDisposition::Drop,
ArrayRejectClass::Transient | ArrayRejectClass::Reauthenticate => RejectDisposition::Park,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn schema_rejects_resend_the_schema() {
assert_eq!(
reject_disposition(ArrayRejectReason::ArrayUnknown),
RejectDisposition::ResendSchema
);
assert_eq!(
reject_disposition(ArrayRejectReason::SchemaTooNew),
RejectDisposition::ResendSchema
);
}
#[test]
fn retention_floor_requests_a_catch_up() {
assert_eq!(
reject_disposition(ArrayRejectReason::RetentionFloor),
RejectDisposition::CatchUp
);
}
#[test]
fn permanent_rejects_drop_the_op() {
for reason in [
ArrayRejectReason::ShapeInvalid,
ArrayRejectReason::EngineRefused,
ArrayRejectReason::PermissionDenied,
] {
assert_eq!(reject_disposition(reason), RejectDisposition::Drop);
}
}
#[test]
fn transient_and_auth_rejects_park_the_op() {
for reason in [
ArrayRejectReason::EngineUnavailable,
ArrayRejectReason::SnapshotCapacity,
ArrayRejectReason::SnapshotBufferLost,
ArrayRejectReason::Unauthenticated,
] {
assert_eq!(reject_disposition(reason), RejectDisposition::Park);
}
}
}