use heck::ToUpperCamelCase;
pub fn status_variant_name(code: u16) -> Result<String, String> {
let status = http::StatusCode::from_u16(code)
.map_err(|_| format!("invalid HTTP status code `{code}` in `response`"))?;
Ok(match status.canonical_reason() {
Some(reason) => reason.to_upper_camel_case(),
None => format!("Status{code}"),
})
}
#[cfg(test)]
mod tests {
use super::status_variant_name;
#[test]
fn canonical_reasons_become_camel_idents() {
assert_eq!(status_variant_name(200).unwrap(), "Ok");
assert_eq!(status_variant_name(201).unwrap(), "Created");
assert_eq!(status_variant_name(204).unwrap(), "NoContent");
assert_eq!(status_variant_name(207).unwrap(), "MultiStatus");
assert_eq!(status_variant_name(404).unwrap(), "NotFound");
assert_eq!(status_variant_name(418).unwrap(), "IMATeapot");
assert_eq!(status_variant_name(500).unwrap(), "InternalServerError");
}
#[test]
fn codes_without_a_reason_fall_back_to_status_code() {
assert_eq!(status_variant_name(299).unwrap(), "Status299");
assert_eq!(status_variant_name(999).unwrap(), "Status999");
}
#[test]
fn out_of_range_codes_error() {
assert!(status_variant_name(0).is_err());
assert!(status_variant_name(99).is_err());
assert!(status_variant_name(1000).is_err());
}
}