use trust_tasks_rs::{StandardCode, TrustTaskCode};
pub fn status_for_code(code: &TrustTaskCode) -> u16 {
match code {
TrustTaskCode::Standard(c) => standard_status(*c),
TrustTaskCode::Extended { .. } => 422,
}
}
fn standard_status(code: StandardCode) -> u16 {
match code {
StandardCode::MalformedRequest => 400,
StandardCode::PermissionDenied => 403,
StandardCode::IdConflict => 409,
StandardCode::UnsupportedType
| StandardCode::UnsupportedVersion
| StandardCode::Expired
| StandardCode::ProofRequired
| StandardCode::ProofInvalid
| StandardCode::WrongRecipient
| StandardCode::IdentityMismatch
| StandardCode::Cancelled
| StandardCode::TaskFailed => 422,
StandardCode::Unavailable => 503,
StandardCode::InternalError => 500,
_ => 500,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn standard_codes_map_to_binding_spec_statuses() {
assert_eq!(status_for_code(&StandardCode::MalformedRequest.into()), 400);
assert_eq!(status_for_code(&StandardCode::PermissionDenied.into()), 403);
assert_eq!(status_for_code(&StandardCode::IdConflict.into()), 409);
assert_eq!(status_for_code(&StandardCode::UnsupportedType.into()), 422);
assert_eq!(
status_for_code(&StandardCode::UnsupportedVersion.into()),
422
);
assert_eq!(status_for_code(&StandardCode::Expired.into()), 422);
assert_eq!(status_for_code(&StandardCode::ProofRequired.into()), 422);
assert_eq!(status_for_code(&StandardCode::ProofInvalid.into()), 422);
assert_eq!(status_for_code(&StandardCode::WrongRecipient.into()), 422);
assert_eq!(status_for_code(&StandardCode::IdentityMismatch.into()), 422);
assert_eq!(status_for_code(&StandardCode::Cancelled.into()), 422);
assert_eq!(status_for_code(&StandardCode::TaskFailed.into()), 422);
assert_eq!(status_for_code(&StandardCode::Unavailable.into()), 503);
assert_eq!(status_for_code(&StandardCode::InternalError.into()), 500);
}
#[test]
fn identity_related_codes_share_one_status() {
let identity_codes = [
StandardCode::ProofRequired,
StandardCode::ProofInvalid,
StandardCode::IdentityMismatch,
StandardCode::WrongRecipient,
];
for code in identity_codes {
assert_eq!(
status_for_code(&code.into()),
422,
"{code:?} must not be distinguishable by status code"
);
}
}
#[test]
fn extension_codes_default_to_422() {
let code = TrustTaskCode::Extended {
slug: "acl/grant".into(),
local: "lastAuthorityProtected".into(),
};
assert_eq!(status_for_code(&code), 422);
}
}