module; #include #include #include export module routemon:problem; import std; import :locale; namespace http = boost::beast::http; namespace json = boost::json; namespace routemon::problem { export struct details { http::status status; blocale::message title; std::string_view type_uri; std::optional detail = std::nullopt; std::optional instance = std::nullopt; auto set_detail(blocale::message detail) -> details& { this->detail = detail; return *this; } auto set_instance(std::string&& instance) -> details& { this->instance = instance; return *this; } auto set_instance(std::string_view instance) -> details& { this->instance = std::string{instance}; return *this; } }; export auto tag_invoke(json::value_from_tag, json::value& jv, details const& details, std::locale locale) -> void { auto obj = json::object{ {"type", details.type_uri}, {"title", details.title.str(locale)}, {"status", static_cast(details.status)}, }; if (details.detail) obj["detail"] = details.detail->str(locale); if (details.instance) obj["instance"] = *details.instance; jv = obj; } export struct tpl { http::status status; blocale::message title; std::string_view type_uri; auto instantiate() const -> details { return details{status, title, type_uri}; } }; }