11#include <fmt/format.h>
13#include <userver/formats/serialize/to.hpp>
15USERVER_NAMESPACE_BEGIN
20[[
noreturn]]
void AbortWithStacktrace(std::string_view message)
noexcept;
27 zstring_view() =
delete;
30 constexpr zstring_view(
const char* str)
noexcept : std::string_view{str} {
34 zstring_view(
const std::string& str)
noexcept : std::string_view{str} {}
39 void remove_suffix(std::size_t) =
delete;
40 void swap(std::string_view&) =
delete;
41 void swap(
zstring_view& other)
noexcept { std::string_view::swap(other); }
43 constexpr const char* c_str()
const noexcept {
return std::string_view::data(); }
63 constexpr zstring_view(
const char* str, std::size_t len)
noexcept : std::string_view{str, len} {
65 if (!str || str[len] != 0) {
66 USERVER_NAMESPACE::
utils::AbortWithStacktrace(
"`str` should be not null and should be null terminated");
74 return typename Value::Builder(std::string_view{view}).ExtractValue();
77template <
typename StringBuilder>
78void WriteToStream(
zstring_view view, StringBuilder& sw) {
79 WriteToStream(std::string_view{view}, sw);
87struct fmt::formatter<USERVER_NAMESPACE::
utils::
zstring_view,
char> : fmt::formatter<std::string_view> {};
92template <
class... NotUsed>
94 ->
decltype(fmt::runtime(std::string_view{s})) {
95 static_assert(
sizeof...(NotUsed) == 0);
96 return fmt::runtime(std::string_view{s});