aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/yt/string/enum-inl.h
diff options
context:
space:
mode:
authorgaltsev <galtsev@yandex-team.com>2023-05-04 15:39:00 +0300
committergaltsev <galtsev@yandex-team.com>2023-05-04 15:39:00 +0300
commit3b3c4be949271feb82f21388e31fb56cb7666062 (patch)
tree64a97f249511579809def05223ab5c1c360bf393 /library/cpp/yt/string/enum-inl.h
parent69ceb35cb906509492a4b265c9872ae464c18952 (diff)
downloadydb-3b3c4be949271feb82f21388e31fb56cb7666062.tar.gz
YT-18920: Add `TryDecodeEnumValue()`
Diffstat (limited to 'library/cpp/yt/string/enum-inl.h')
-rw-r--r--library/cpp/yt/string/enum-inl.h46
1 files changed, 27 insertions, 19 deletions
diff --git a/library/cpp/yt/string/enum-inl.h b/library/cpp/yt/string/enum-inl.h
index 2fa138f52f..205ececae3 100644
--- a/library/cpp/yt/string/enum-inl.h
+++ b/library/cpp/yt/string/enum-inl.h
@@ -4,6 +4,8 @@
#include "enum.h"
#endif
+#include "format.h"
+
#include <library/cpp/yt/exception/exception.h>
#include <util/string/printf.h>
@@ -30,29 +32,35 @@ template <class T>
std::optional<T> TryParseEnum(TStringBuf value)
{
auto tryFromString = [] (TStringBuf value) -> std::optional<T> {
- try {
- return TEnumTraits<T>::FindValueByLiteral(DecodeEnumValue(value));
- } catch (const TSimpleException&) {
- TStringBuf typeName;
- auto isTypeNameCorrect = value.NextTok('(', typeName) && typeName == TEnumTraits<T>::GetTypeName();
- if (!isTypeNameCorrect) {
- throw;
- }
+ if (auto decodedValue = TryDecodeEnumValue(value)) {
+ return TEnumTraits<T>::FindValueByLiteral(*decodedValue);
+ }
- TStringBuf enumValue;
- std::underlying_type_t<T> underlyingValue;
- auto isEnumValueCorrect = value.NextTok(')', enumValue) && TryFromString(enumValue, underlyingValue);
- if (!isEnumValueCorrect) {
- throw;
- }
+ auto reportError = [value] () {
+ throw TSimpleException(Format("Enum value %Qv is neither in a proper underscore case nor in a format \"%v(123)\"",
+ value,
+ TEnumTraits<T>::GetTypeName()));
+ };
- auto isParsingComplete = value.empty();
- if (!isParsingComplete) {
- throw;
- }
+ TStringBuf typeName;
+ auto isTypeNameCorrect = value.NextTok('(', typeName) && typeName == TEnumTraits<T>::GetTypeName();
+ if (!isTypeNameCorrect) {
+ reportError();
+ }
+
+ TStringBuf enumValue;
+ std::underlying_type_t<T> underlyingValue = 0;
+ auto isEnumValueCorrect = value.NextTok(')', enumValue) && TryFromString(enumValue, underlyingValue);
+ if (!isEnumValueCorrect) {
+ reportError();
+ }
- return static_cast<T>(underlyingValue);
+ auto isParsingComplete = value.empty();
+ if (!isParsingComplete) {
+ reportError();
}
+
+ return static_cast<T>(underlyingValue);
};
if constexpr (TEnumTraits<T>::IsBitEnum) {