From 9852998440dcaa3eec11377553e996ff9852bb4e Mon Sep 17 00:00:00 2001 From: pechatnov Date: Thu, 26 Mar 2026 10:11:59 +0300 Subject: Add suggestions on enum parse error commit_hash:3b7f35f613737aa92f473877e8b24782f7dfcd2a --- library/cpp/yt/string/enum.cpp | 40 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) (limited to 'library/cpp/yt/string/enum.cpp') 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& 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 @@ -32,8 +60,12 @@ std::optional DecodeEnumValueImpl(TStringBuf value) return camelValue; } +//////////////////////////////////////////////////////////////////////////////// + } // namespace NDetail +//////////////////////////////////////////////////////////////////////////////// + std::optional TryDecodeEnumValue(TStringBuf value) { return NDetail::DecodeEnumValueImpl(value); -- cgit v1.3