Skip to main content

http_mel/
status.rs

1use melodium_core::{executive::*, *};
2use melodium_macro::{mel_data, mel_function};
3use trillium::Status;
4
5/// HTTP response status code.
6///
7/// `ToString` and `Display` return the numeric code followed by the canonical reason phrase,
8/// e.g. `"200 OK"` or `"404 Not Found"`.
9#[mel_data(traits(ToString PartialEquality Equality Display))]
10#[derive(Debug, Clone, PartialEq, Eq, Serialize)]
11pub struct HttpStatus(pub Status);
12
13impl ToString for HttpStatus {
14    fn to_string(&self) -> string {
15        format!("{} {}", self.0 as u16, self.0.canonical_reason())
16    }
17}
18
19impl Display for HttpStatus {
20    fn display(&self, f: &mut core::fmt::Formatter<'_>) -> Result<(), core::fmt::Error> {
21        write!(f, "{}", melodium_core::executive::ToString::to_string(self))
22    }
23}
24
25/// Parse an HTTP status from its numeric code.
26///
27/// Returns `None` if `code` does not correspond to a recognised HTTP status.
28#[mel_function]
29pub fn status(code: u16) -> Option<HttpStatus> {
30    match Status::try_from(code) {
31        Ok(status) => Some(HttpStatus(status)),
32        Err(_) => None,
33    }
34}
35
36/// Return HTTP status `200 OK`.
37#[mel_function]
38pub fn ok() -> HttpStatus {
39    HttpStatus(Status::Ok)
40}
41
42/// Return HTTP status `301 Moved Permanently`.
43#[mel_function]
44pub fn moved_permanently() -> HttpStatus {
45    HttpStatus(Status::MovedPermanently)
46}
47
48/// Return HTTP status `307 Temporary Redirect`.
49#[mel_function]
50pub fn temporary_redirect() -> HttpStatus {
51    HttpStatus(Status::TemporaryRedirect)
52}
53
54/// Return HTTP status `308 Permanent Redirect`.
55#[mel_function]
56pub fn permanent_redirect() -> HttpStatus {
57    HttpStatus(Status::PermanentRedirect)
58}
59
60/// Return HTTP status `403 Forbidden`.
61#[mel_function]
62pub fn forbidden() -> HttpStatus {
63    HttpStatus(Status::Forbidden)
64}
65
66/// Return HTTP status `404 Not Found`.
67#[mel_function]
68pub fn not_found() -> HttpStatus {
69    HttpStatus(Status::NotFound)
70}