Moved ToKebapCasName to utils

This commit is contained in:
Ivan-lis 2024-12-19 17:17:28 +00:00 committed by sha512sum
parent f36b544b11
commit 54e9556478
2 changed files with 30 additions and 34 deletions

View file

@ -2,43 +2,10 @@
#include <libxml++/libxml++.h> #include <libxml++/libxml++.h>
#include <larra/utils.hpp> #include <larra/utils.hpp>
#include <nameof.hpp>
#include <ranges>
#include <variant> #include <variant>
namespace larra::xmpp { namespace larra::xmpp {
namespace impl {
// std::isupper not declared as constexpr
constexpr auto IsUpper(char ch) -> bool {
return ch >= 'A' && ch <= 'Z';
}
constexpr auto ToLower(char ch) -> char {
return (ch >= 'A' && ch <= 'Z') ? static_cast<char>(ch + ('a' - 'A')) : ch;
}
template <typename T>
constexpr auto ToKebabCaseName() -> std::string_view {
static constexpr auto rawStr = nameof::nameof_short_type<T>();
constexpr auto str = [] {
return rawStr //
| std::views::transform([](auto ch) {
return impl::IsUpper(ch) ? std::array<char, 2>{'-', impl::ToLower(ch)} : std::array<char, 2>{ch, '\0'};
}) //
| std::views::join //
| std::views::filter([](char ch) {
return ch != '\0';
}) //
| std::views::drop(1);
};
static constexpr auto arr = str() | std::ranges::to<utils::RangeToWrapper<std::array<char, std::ranges::distance(str())>>>();
return {arr.data(), arr.size()};
}
} // namespace impl
namespace error::stream { namespace error::stream {
struct BaseError : std::exception {}; struct BaseError : std::exception {};
@ -48,7 +15,7 @@ struct BaseError : std::exception {};
template <typename T> template <typename T>
struct ErrorImpl : BaseError { struct ErrorImpl : BaseError {
static constexpr auto kDefaultName = "stream:error"; static constexpr auto kDefaultName = "stream:error";
static inline const auto kKebabCaseName = static_cast<std::string>(impl::ToKebabCaseName<T>()); static inline const auto kKebabCaseName = static_cast<std::string>(utils::ToKebabCaseName<T>());
static constexpr auto kErrorMessage = [] -> std::string_view { static constexpr auto kErrorMessage = [] -> std::string_view {
static constexpr auto name = nameof::nameof_short_type<T>(); static constexpr auto name = nameof::nameof_short_type<T>();

View file

@ -1,5 +1,7 @@
#pragma once #pragma once
#include <boost/pfr.hpp> #include <boost/pfr.hpp>
#include <nameof.hpp>
#include <ranges>
#include <utempl/utils.hpp> #include <utempl/utils.hpp>
namespace larra::xmpp::utils { namespace larra::xmpp::utils {
@ -309,4 +311,31 @@ auto AccumulateFieldLength(const T& obj) -> std::size_t {
return totalLength; return totalLength;
} }
template <typename T>
constexpr auto ToKebabCaseName() -> std::string_view {
static constexpr auto rawStr = nameof::nameof_short_type<T>();
// std::isupper and std::tolower are not declared as constexpr
static constexpr auto isUpper = [](char ch) {
return ch >= 'A' && ch <= 'Z';
};
static constexpr auto toLower = [](char ch) {
return (ch >= 'A' && ch <= 'Z') ? static_cast<char>(ch + ('a' - 'A')) : ch;
};
constexpr auto str = [] {
return rawStr //
| std::views::transform([](auto ch) {
return isUpper(ch) ? std::array<char, 2>{'-', toLower(ch)} : std::array<char, 2>{ch, '\0'};
}) //
| std::views::join //
| std::views::filter([](char ch) {
return ch != '\0';
}) //
| std::views::drop(1);
};
static constexpr auto arr = str() | std::ranges::to<utils::RangeToWrapper<std::array<char, std::ranges::distance(str())>>>();
return {arr.data(), arr.size()};
}
} // namespace larra::xmpp::utils } // namespace larra::xmpp::utils