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
| StandardCode::UnsupportedType
| StandardCode::UnsupportedVersion
| StandardCode::Expired => 400,
StandardCode::ProofRequired | StandardCode::ProofInvalid => 401,
StandardCode::PermissionDenied
| StandardCode::WrongRecipient
| StandardCode::IdentityMismatch => 403,
StandardCode::TaskFailed => 422,
StandardCode::Unavailable => 503,
StandardCode::InternalError => 500,
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn standard_codes_map_to_documented_statuses() {
assert_eq!(status_for_code(&StandardCode::MalformedRequest.into()), 400);
assert_eq!(status_for_code(&StandardCode::Expired.into()), 400);
assert_eq!(status_for_code(&StandardCode::ProofRequired.into()), 401);
assert_eq!(status_for_code(&StandardCode::IdentityMismatch.into()), 403);
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 extension_codes_default_to_422() {
let code = TrustTaskCode::Extended {
slug: "acl/grant".into(),
local: "permission_denied".into(),
};
assert_eq!(status_for_code(&code), 422);
}
}