use crate::errors::{
ACCOUNT_LIMIT_EXHAUSTED, ACCOUNT_NOT_ENTITLED, AUTH_FAILED, INVALID_ITEM, MODEL_UNAVAILABLE,
PROVIDER_ERROR, RATE_LIMITED,
};
pub fn item_code_for_status(status: u16) -> Option<&'static str> {
match status {
401 | 403 => Some(AUTH_FAILED),
404 => Some(MODEL_UNAVAILABLE),
429 | 529 => Some(RATE_LIMITED),
408 | 500..=599 => Some(PROVIDER_ERROR),
400..=499 => Some(INVALID_ITEM),
_ => None,
}
}
pub mod workers_ai_codes {
pub const INVALID_DATA: u64 = 5004;
pub const INCOMPLETE_REQUEST: u64 = 3003;
pub const NO_SUCH_MODEL: u64 = 5007;
pub const MODEL_NOT_FOUND: u64 = 3042;
pub const NEEDS_PAID_PLAN: u64 = 5035;
pub const MODEL_AGREEMENT: u64 = 5016;
pub const ACCOUNT_BLOCKED: u64 = 3023;
pub const REQUEST_TOO_LARGE: u64 = 3006;
pub const TIMEOUT: u64 = 3007;
pub const ABORTED: u64 = 3008;
pub const DAILY_ALLOCATION_USED: u64 = 3036;
pub const OUT_OF_CAPACITY: u64 = 3040;
pub const ALL: &[u64] = &[
INVALID_DATA,
INCOMPLETE_REQUEST,
NO_SUCH_MODEL,
MODEL_NOT_FOUND,
NEEDS_PAID_PLAN,
MODEL_AGREEMENT,
ACCOUNT_BLOCKED,
REQUEST_TOO_LARGE,
TIMEOUT,
ABORTED,
DAILY_ALLOCATION_USED,
OUT_OF_CAPACITY,
];
}
pub fn workers_ai_item_code(status: u16, code: Option<u64>) -> Option<&'static str> {
use workers_ai_codes::*;
if !(400..=599).contains(&status) {
return None;
}
match code {
Some(INVALID_DATA | INCOMPLETE_REQUEST | REQUEST_TOO_LARGE) => Some(INVALID_ITEM),
Some(NO_SUCH_MODEL | MODEL_NOT_FOUND) => Some(MODEL_UNAVAILABLE),
Some(NEEDS_PAID_PLAN | MODEL_AGREEMENT | ACCOUNT_BLOCKED) => Some(ACCOUNT_NOT_ENTITLED),
Some(TIMEOUT | ABORTED) => Some(PROVIDER_ERROR),
Some(DAILY_ALLOCATION_USED) => Some(ACCOUNT_LIMIT_EXHAUSTED),
Some(OUT_OF_CAPACITY) => Some(RATE_LIMITED),
_ => item_code_for_status(status),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn statuses_map_to_item_codes() {
for status in [429, 529] {
assert_eq!(item_code_for_status(status), Some(RATE_LIMITED));
}
for status in [408, 500, 502, 503] {
assert_eq!(item_code_for_status(status), Some(PROVIDER_ERROR));
}
for status in [400, 413, 422, 409] {
assert_eq!(item_code_for_status(status), Some(INVALID_ITEM));
}
for status in [401, 403] {
assert_eq!(item_code_for_status(status), Some(AUTH_FAILED));
}
assert_eq!(item_code_for_status(404), Some(MODEL_UNAVAILABLE));
assert_eq!(item_code_for_status(200), None);
}
#[test]
fn workers_ai_codes_decide_before_the_status() {
assert_eq!(
workers_ai_item_code(429, Some(3036)),
Some(ACCOUNT_LIMIT_EXHAUSTED)
);
assert_eq!(workers_ai_item_code(429, Some(3040)), Some(RATE_LIMITED));
assert_eq!(workers_ai_item_code(429, None), Some(RATE_LIMITED));
for code in [5035, 5016, 3023] {
assert_eq!(
workers_ai_item_code(403, Some(code)),
Some(ACCOUNT_NOT_ENTITLED)
);
}
assert_eq!(workers_ai_item_code(403, Some(9999)), Some(AUTH_FAILED));
assert_eq!(
workers_ai_item_code(400, Some(5007)),
Some(MODEL_UNAVAILABLE)
);
assert_eq!(
workers_ai_item_code(404, Some(3042)),
Some(MODEL_UNAVAILABLE)
);
assert_eq!(workers_ai_item_code(413, Some(3006)), Some(INVALID_ITEM));
assert_eq!(workers_ai_item_code(408, Some(3008)), Some(PROVIDER_ERROR));
assert_eq!(workers_ai_item_code(200, Some(3036)), None);
}
}