summaryrefslogtreecommitdiffstats
path: root/library/cpp/yt/string/enum.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'library/cpp/yt/string/enum.cpp')
-rw-r--r--library/cpp/yt/string/enum.cpp40
1 files changed, 36 insertions, 4 deletions
diff --git a/library/cpp/yt/string/enum.cpp b/library/cpp/yt/string/enum.cpp
index 844254faa0f..beeba753daf 100644
--- a/library/cpp/yt/string/enum.cpp
+++ b/library/cpp/yt/string/enum.cpp
@@ -8,11 +8,39 @@ namespace NYT {
namespace NDetail {
-void ThrowMalformedEnumValueException(TStringBuf typeName, TStringBuf value)
+////////////////////////////////////////////////////////////////////////////////
+
+#if defined(_MSC_VER)
+
+extern "C" TEnumSuggestionsCalculator TryGetEnumSuggestionsCalculatorWeak()
+{
+ return nullptr;
+}
+
+__pragma(comment(linker, "/alternatename:TryGetEnumSuggestionsCalculator=TryGetEnumSuggestionsCalculatorWeak"))
+
+#else
+
+extern "C" Y_WEAK TEnumSuggestionsCalculator TryGetEnumSuggestionsCalculator()
{
- throw TSimpleException(Format("Error parsing %v value %Qv",
- typeName,
- value));
+ return nullptr;
+}
+
+#endif
+
+////////////////////////////////////////////////////////////////////////////////
+
+void ThrowMalformedEnumValueException(
+ TStringBuf typeName,
+ TStringBuf value,
+ const std::span<const TStringBuf>& domainNames)
+{
+ auto errorMessage = Format("Error parsing %v value %Qv", typeName, value);
+ auto suggestionsCalculator = TryGetEnumSuggestionsCalculator();
+ if (!domainNames.empty() && suggestionsCalculator) {
+ errorMessage += Format("; closest possible values are %v", suggestionsCalculator(value, domainNames));
+ }
+ throw TSimpleException(errorMessage);
}
template <bool ThrowOnError>
@@ -32,8 +60,12 @@ std::optional<std::string> DecodeEnumValueImpl(TStringBuf value)
return camelValue;
}
+////////////////////////////////////////////////////////////////////////////////
+
} // namespace NDetail
+////////////////////////////////////////////////////////////////////////////////
+
std::optional<std::string> TryDecodeEnumValue(TStringBuf value)
{
return NDetail::DecodeEnumValueImpl<false>(value);