///|
/// HTTP status codes as registered with IANA.
/// See: https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml
pub(all) enum StatusCode {
  /// RFC 9110, 15.2.1
  Continue
  /// RFC 9110, 15.2.2
  SwitchingProtocols
  /// RFC 2518, 10.1
  Processing
  /// RFC 8297
  EarlyHints
  /// RFC 9110, 15.3.1
  OK
  /// RFC 9110, 15.3.2
  Created
  /// RFC 9110, 15.3.3
  Accepted
  /// RFC 9110, 15.3.4
  NonAuthoritativeInfo
  /// RFC 9110, 15.3.5
  NoContent
  /// RFC 9110, 15.3.6
  ResetContent
  /// RFC 9110, 15.3.7
  PartialContent
  /// RFC 4918, 11.1
  MultiStatus
  /// RFC 5842, 7.1
  AlreadyReported
  /// RFC 3229, 10.4.1
  IMUsed
  /// RFC 9110, 15.4.1
  MultipleChoices
  /// RFC 9110, 15.4.2
  MovedPermanently
  /// RFC 9110, 15.4.3
  Found
  /// RFC 9110, 15.4.4
  SeeOther
  /// RFC 9110, 15.4.5
  NotModified
  /// RFC 9110, 15.4.6
  UseProxy
  /// RFC 9110, 15.4.8
  TemporaryRedirect
  /// RFC 9110, 15.4.9
  PermanentRedirect
  /// RFC 9110, 15.5.1
  BadRequest
  /// RFC 9110, 15.5.2
  Unauthorized
  /// RFC 9110, 15.5.3
  PaymentRequired
  /// RFC 9110, 15.5.4
  Forbidden
  /// RFC 9110, 15.5.5
  NotFound
  /// RFC 9110, 15.5.6
  MethodNotAllowed
  /// RFC 9110, 15.5.7
  NotAcceptable
  /// RFC 9110, 15.5.8
  ProxyAuthRequired
  /// RFC 9110, 15.5.9
  RequestTimeout
  /// RFC 9110, 15.5.10
  Conflict
  /// RFC 9110, 15.5.11
  Gone
  /// RFC 9110, 15.5.12
  LengthRequired
  /// RFC 9110, 15.5.13
  PreconditionFailed
  /// RFC 9110, 15.5.14
  RequestEntityTooLarge
  /// RFC 9110, 15.5.15
  RequestUriTooLong
  /// RFC 9110, 15.5.16
  UnsupportedMediaType
  /// RFC 9110, 15.5.17
  RequestedRangeNotSatisfiable
  /// RFC 9110, 15.5.18
  ExpectationFailed
  /// RFC 9110, 15.5.19 (Unused)
  Teapot
  /// RFC 9110, 15.5.20
  MisdirectedRequest
  /// RFC 9110, 15.5.21
  UnprocessableEntity
  /// RFC 4918, 11.3
  Locked
  /// RFC 4918, 11.4
  FailedDependency
  /// RFC 8470, 5.2.
  TooEarly
  /// RFC 9110, 15.5.22
  UpgradeRequired
  /// RFC 6585, 3
  PreconditionRequired
  /// RFC 6585, 4
  TooManyRequests
  /// RFC 6585, 5
  RequestHeaderFieldsTooLarge
  /// RFC 7725, 3
  UnavailableForLegalReasons
  /// RFC 9110, 15.6.1
  InternalServerError
  /// RFC 9110, 15.6.2
  NotImplemented
  /// RFC 9110, 15.6.3
  BadGateway
  /// RFC 9110, 15.6.4
  ServiceUnavailable
  /// RFC 9110, 15.6.5
  GatewayTimeout
  /// RFC 9110, 15.6.6
  HttpVersionNotSupported
  /// RFC 2295, 8.1
  VariantAlsoNegotiates
  /// RFC 4918, 11.5
  InsufficientStorage
  /// RFC 5842, 7.2
  LoopDetected
  /// RFC 2774, 7
  NotExtended
  /// RFC 6585, 6
  NetworkAuthenticationRequired
  Custom(Int)
} derive(ToJson, Eq)

///|
pub fn StatusCode::from_int(i : Int) -> StatusCode {
  match i {
    100 => Continue
    101 => SwitchingProtocols
    102 => Processing
    103 => EarlyHints
    200 => OK
    201 => Created
    202 => Accepted
    203 => NonAuthoritativeInfo
    204 => NoContent
    205 => ResetContent
    206 => PartialContent
    207 => MultiStatus
    208 => AlreadyReported
    226 => IMUsed
    300 => MultipleChoices
    301 => MovedPermanently
    302 => Found
    303 => SeeOther
    304 => NotModified
    305 => UseProxy
    307 => TemporaryRedirect
    308 => PermanentRedirect
    400 => BadRequest
    401 => Unauthorized
    402 => PaymentRequired
    403 => Forbidden
    404 => NotFound
    405 => MethodNotAllowed
    406 => NotAcceptable
    407 => ProxyAuthRequired
    408 => RequestTimeout
    409 => Conflict
    410 => Gone
    411 => LengthRequired
    412 => PreconditionFailed
    413 => RequestEntityTooLarge
    414 => RequestUriTooLong
    415 => UnsupportedMediaType
    416 => RequestedRangeNotSatisfiable
    417 => ExpectationFailed
    418 => Teapot
    421 => MisdirectedRequest
    422 => UnprocessableEntity
    423 => Locked
    424 => FailedDependency
    425 => TooEarly
    426 => UpgradeRequired
    428 => PreconditionRequired
    429 => TooManyRequests
    431 => RequestHeaderFieldsTooLarge
    451 => UnavailableForLegalReasons
    500 => InternalServerError
    501 => NotImplemented
    502 => BadGateway
    503 => ServiceUnavailable
    504 => GatewayTimeout
    505 => HttpVersionNotSupported
    506 => VariantAlsoNegotiates
    507 => InsufficientStorage
    508 => LoopDetected
    510 => NotExtended
    511 => NetworkAuthenticationRequired
    _ => Custom(i)
  }
}

///|
pub fn StatusCode::to_int(self : StatusCode) -> Int {
  match self {
    Continue => 100
    SwitchingProtocols => 101
    Processing => 102
    EarlyHints => 103
    OK => 200
    Created => 201
    Accepted => 202
    NonAuthoritativeInfo => 203
    NoContent => 204
    ResetContent => 205
    PartialContent => 206
    MultiStatus => 207
    AlreadyReported => 208
    IMUsed => 226
    MultipleChoices => 300
    MovedPermanently => 301
    Found => 302
    SeeOther => 303
    NotModified => 304
    UseProxy => 305
    TemporaryRedirect => 307
    PermanentRedirect => 308
    BadRequest => 400
    Unauthorized => 401
    PaymentRequired => 402
    Forbidden => 403
    NotFound => 404
    MethodNotAllowed => 405
    NotAcceptable => 406
    ProxyAuthRequired => 407
    RequestTimeout => 408
    Conflict => 409
    Gone => 410
    LengthRequired => 411
    PreconditionFailed => 412
    RequestEntityTooLarge => 413
    RequestUriTooLong => 414
    UnsupportedMediaType => 415
    RequestedRangeNotSatisfiable => 416
    ExpectationFailed => 417
    Teapot => 418
    MisdirectedRequest => 421
    UnprocessableEntity => 422
    Locked => 423
    FailedDependency => 424
    TooEarly => 425
    UpgradeRequired => 426
    PreconditionRequired => 428
    TooManyRequests => 429
    RequestHeaderFieldsTooLarge => 431
    UnavailableForLegalReasons => 451
    InternalServerError => 500
    NotImplemented => 501
    BadGateway => 502
    ServiceUnavailable => 503
    GatewayTimeout => 504
    HttpVersionNotSupported => 505
    VariantAlsoNegotiates => 506
    InsufficientStorage => 507
    LoopDetected => 508
    NotExtended => 510
    NetworkAuthenticationRequired => 511
    Custom(i) => i
  }
}

///|
test {
  inspect(StatusCode::OK.to_int(), content="200")
}