(.require
 [library
  [lux (.except)
   ["$" documentation]
   [data
    ["[0]" text (.only)
     ["%" \\format (.only format)]]
    [collection
     ["[0]" list (.use "[1]#[0]" monoid)]]]
   [meta
    [macro
     ["[0]" template]]]]]
 [\\library
  ["[0]" /]])

(def description
  (template (_ <name>)
    [($.definition <name>
       (|> (template.text [<name>])
           (text.replaced "_" " ")
           text.upper_cased
           (format (%.nat <name>) ": ")))]))

(`` (def all_100-300
      (List $.Documentation)
      (list (,, (with_template [<name>]
                  [(description <name>)]

                  ... 1xx Informational response
                  [/.continue]
                  [/.switching_protocols]
                  [/.processing]
                  [/.early_hints]

                  ... 2xx Success
                  [/.ok]
                  [/.created]
                  [/.accepted]
                  [/.non_authoritative_information]
                  [/.no_content]
                  [/.reset_content]
                  [/.partial_content]
                  [/.multi_status]
                  [/.already_reported]
                  [/.im_used]

                  ... 3xx Redirection
                  [/.multiple_choices]
                  [/.moved_permanently]
                  [/.found]
                  [/.see_other]
                  [/.not_modified]
                  [/.use_proxy]
                  [/.switch_proxy]
                  [/.temporary_redirect]
                  [/.permanent_redirect]
                  ))
            )))

(`` (def all_400-500
      (List $.Documentation)
      (list (,, (with_template [<name>]
                  [(description <name>)]

                  ... 4xx Client errors
                  [/.bad_request]
                  [/.unauthorized]
                  [/.payment_required]
                  [/.forbidden]
                  [/.not_found]
                  [/.method_not_allowed]
                  [/.not_acceptable]
                  [/.proxy_authentication_required]
                  [/.request_timeout]
                  [/.conflict]
                  [/.gone]
                  [/.length_required]
                  [/.precondition_failed]
                  [/.payload_too_large]
                  [/.uri_too_long]
                  [/.unsupported_media_type]
                  [/.range_not_satisfiable]
                  [/.expectation_failed]
                  [/.im_a_teapot]
                  [/.misdirected_request]
                  [/.unprocessable_entity]
                  [/.locked]
                  [/.failed_dependency]
                  [/.upgrade_required]
                  [/.precondition_required]
                  [/.too_many_requests]
                  [/.request_header_fields_too_large]
                  [/.unavailable_for_legal_reasons]

                  ... 5xx Server errors
                  [/.internal_server_error]
                  [/.not_implemented]
                  [/.bad_gateway]
                  [/.service_unavailable]
                  [/.gateway_timeout]
                  [/.http_version_not_supported]
                  [/.variant_also_negotiates]
                  [/.insufficient_storage]
                  [/.loop_detected]
                  [/.not_extended]
                  [/.network_authentication_required]
                  ))
            )))

(def .public documentation
  (List $.Documentation)
  (list.partial ($.module /._
                          "")

                (all list#composite
                     all_100-300
                     all_400-500
                     )
                ))
