#pragma once #include "public.h" #include #include #include namespace NYT { //////////////////////////////////////////////////////////////////////////////// template concept CPrimitiveConvertible = std::same_as || std::same_as || std::same_as || std::same_as || std::same_as || std::same_as || std::same_as || std::same_as || std::constructible_from || std::same_as || std::same_as || std::same_as || std::same_as; //////////////////////////////////////////////////////////////////////////////// namespace NAttributeValueConversionImpl { struct TTo : public TTagInvokeCpoBase { }; //////////////////////////////////////////////////////////////////////////////// template struct TFrom : public TTagInvokeCpoBase> { }; } // namespace NAttributeValueConversionImpl //////////////////////////////////////////////////////////////////////////////// inline constexpr NAttributeValueConversionImpl::TTo ToErrorAttributeValue = {}; template inline constexpr NAttributeValueConversionImpl::TFrom FromErrorAttributeValue = {}; //////////////////////////////////////////////////////////////////////////////// template concept CConvertibleToAttributeValue = requires (const T& value) { { NYT::ToErrorAttributeValue(value) } -> std::same_as; }; template concept CConvertibleFromAttributeValue = requires (TStringBuf value) { { NYT::FromErrorAttributeValue(value) } -> std::same_as; }; //////////////////////////////////////////////////////////////////////////////// struct TErrorAttribute { using TKey = std::string; using TValue = std::string; template TErrorAttribute(const TKey& key, const T& value) : Key(key) , Value(NYT::ToErrorAttributeValue(value)) { } TKey Key; TValue Value; }; //////////////////////////////////////////////////////////////////////////////// } // namespace NYT #define ERROR_ATTRIBUTE_INL_H_ #include "error_attribute-inl.h" #undef ERROR_ATTRIBUTE_INL_H_