enum.cpp 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include "enum.h"
  2. #include "format.h"
  3. namespace NYT {
  4. ////////////////////////////////////////////////////////////////////////////////
  5. namespace NDetail {
  6. void ThrowMalformedEnumValueException(TStringBuf typeName, TStringBuf value)
  7. {
  8. throw TSimpleException(Format("Error parsing %v value %Qv",
  9. typeName,
  10. value));
  11. }
  12. template <bool ThrowOnError>
  13. std::optional<TString> DecodeEnumValueImpl(TStringBuf value)
  14. {
  15. auto camelValue = UnderscoreCaseToCamelCase(value);
  16. auto underscoreValue = CamelCaseToUnderscoreCase(camelValue);
  17. if (value != underscoreValue) {
  18. if constexpr (ThrowOnError) {
  19. throw TSimpleException(Format("Enum value %Qv is not in a proper underscore case; did you mean %Qv?",
  20. value,
  21. underscoreValue));
  22. } else {
  23. return std::nullopt;
  24. }
  25. }
  26. return camelValue;
  27. }
  28. } // namespace NDetail
  29. std::optional<TString> TryDecodeEnumValue(TStringBuf value)
  30. {
  31. return NDetail::DecodeEnumValueImpl<false>(value);
  32. }
  33. TString DecodeEnumValue(TStringBuf value)
  34. {
  35. auto decodedValue = NDetail::DecodeEnumValueImpl<true>(value);
  36. YT_VERIFY(decodedValue);
  37. return *decodedValue;
  38. }
  39. TString EncodeEnumValue(TStringBuf value)
  40. {
  41. return CamelCaseToUnderscoreCase(value);
  42. }
  43. ////////////////////////////////////////////////////////////////////////////////
  44. } // namespace NYT