diff options
Diffstat (limited to 'server/src/problem.cppm')
| -rw-r--r-- | server/src/problem.cppm | 85 |
1 files changed, 48 insertions, 37 deletions
diff --git a/server/src/problem.cppm b/server/src/problem.cppm index 8764962..a124312 100644 --- a/server/src/problem.cppm +++ b/server/src/problem.cppm | |||
| @@ -14,47 +14,58 @@ namespace json = boost::json; | |||
| 14 | 14 | ||
| 15 | namespace routemon::problem { | 15 | namespace routemon::problem { |
| 16 | 16 | ||
| 17 | export struct details { | 17 | export struct details |
| 18 | http::status status; | 18 | { |
| 19 | blocale::message title; | 19 | http::status status; |
| 20 | std::string_view type_uri; | 20 | blocale::message title; |
| 21 | std::optional<blocale::message> detail = std::nullopt; | 21 | std::string_view type_uri; |
| 22 | std::optional<std::string> instance = std::nullopt; | 22 | std::optional<blocale::message> detail = std::nullopt; |
| 23 | std::optional<std::string> instance = std::nullopt; | ||
| 23 | 24 | ||
| 24 | auto set_detail(blocale::message detail) -> details& { | 25 | auto set_detail(blocale::message detail) -> details& |
| 25 | this->detail = detail; | 26 | { |
| 26 | return *this; | 27 | this->detail = detail; |
| 27 | } | 28 | return *this; |
| 29 | } | ||
| 28 | 30 | ||
| 29 | auto set_instance(std::string&& instance) -> details& { | 31 | auto set_instance(std::string&& instance) -> details& |
| 30 | this->instance = instance; | 32 | { |
| 31 | return *this; | 33 | this->instance = instance; |
| 32 | } | 34 | return *this; |
| 33 | auto set_instance(std::string_view instance) -> details& { | 35 | } |
| 34 | this->instance = std::string{instance}; | 36 | auto set_instance(std::string_view instance) -> details& |
| 35 | return *this; | 37 | { |
| 36 | } | 38 | this->instance = std::string{instance}; |
| 37 | }; | 39 | return *this; |
| 40 | } | ||
| 41 | }; | ||
| 38 | 42 | ||
| 39 | export auto tag_invoke(json::value_from_tag, json::value& jv, details const& details, std::locale locale) -> void { | 43 | export auto tag_invoke( |
| 40 | auto obj = json::object{ | 44 | json::value_from_tag, json::value& jv, details const& details, |
| 41 | {"type", details.type_uri}, | 45 | std::locale locale) -> void |
| 42 | {"title", details.title.str(locale)}, | 46 | { |
| 47 | auto obj = json::object{ | ||
| 48 | {"type", details.type_uri}, | ||
| 49 | {"title", details.title.str(locale)}, | ||
| 43 | {"status", static_cast<unsigned>(details.status)}, | 50 | {"status", static_cast<unsigned>(details.status)}, |
| 44 | }; | 51 | }; |
| 45 | if (details.detail) obj["detail"] = details.detail->str(locale); | 52 | if (details.detail) |
| 46 | if (details.instance) obj["instance"] = *details.instance; | 53 | obj["detail"] = details.detail->str(locale); |
| 47 | jv = obj; | 54 | if (details.instance) |
| 48 | } | 55 | obj["instance"] = *details.instance; |
| 56 | jv = obj; | ||
| 57 | } | ||
| 49 | 58 | ||
| 50 | export struct tpl { | 59 | export struct tpl |
| 51 | http::status status; | 60 | { |
| 52 | blocale::message title; | 61 | http::status status; |
| 53 | std::string_view type_uri; | 62 | blocale::message title; |
| 63 | std::string_view type_uri; | ||
| 54 | 64 | ||
| 55 | auto instantiate() const -> details { | 65 | auto instantiate() const -> details |
| 56 | return details{status, title, type_uri}; | 66 | { |
| 57 | } | 67 | return details{status, title, type_uri}; |
| 58 | }; | 68 | } |
| 69 | }; | ||
| 59 | 70 | ||
| 60 | } | 71 | } // namespace routemon::problem |