Skip to content

Commit a10178d

Browse files
committed
YT-22617: Support YsonString fields
bbfefec4e98650992f244261e26626c3c28ce1f2
1 parent 0799127 commit a10178d

File tree

2 files changed

+100
-0
lines changed

2 files changed

+100
-0
lines changed

yt/yt/core/ytree/unittests/yson_struct_ut.cpp

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2574,6 +2574,86 @@ TEST(TYsonStructTest, OuterYsonStructWithValidation)
25742574
EXPECT_EQ(deserialized->Inner->MyInt, 42);
25752575
}
25762576

2577+
struct TWithYsonString
2578+
: public TYsonStructLite
2579+
{
2580+
NYson::TYsonString MyString;
2581+
2582+
REGISTER_YSON_STRUCT_LITE(TWithYsonString);
2583+
2584+
static void Register(TRegistrar registrar)
2585+
{
2586+
registrar.Parameter("my_string", &TThis::MyString)
2587+
.Default();
2588+
}
2589+
};
2590+
2591+
TEST(TYsonStructTest, TYsonStringFieldSimple)
2592+
{
2593+
TWithYsonString value;
2594+
2595+
{
2596+
auto node = BuildYsonNodeFluently()
2597+
.BeginMap()
2598+
.Item("my_string").Value(ConvertToYsonString(42))
2599+
.EndMap();
2600+
2601+
Deserialize(value, node->AsMap());
2602+
EXPECT_TRUE(value.MyString);
2603+
EXPECT_EQ(ConvertTo<i32>(value.MyString), 42);
2604+
}
2605+
2606+
{
2607+
std::string message{"Hi mom!"};
2608+
2609+
auto node = BuildYsonNodeFluently()
2610+
.BeginMap()
2611+
.Item("my_string").Value(ConvertToYsonString(message))
2612+
.EndMap();
2613+
2614+
Deserialize(value, node->AsMap());
2615+
EXPECT_TRUE(value.MyString);
2616+
EXPECT_EQ(ConvertTo<std::string>(value.MyString), message);
2617+
}
2618+
2619+
{
2620+
auto config = New<TTestConfig>();
2621+
config->MyString = "Hello, world!";
2622+
2623+
auto node = BuildYsonNodeFluently()
2624+
.BeginMap()
2625+
.Item("my_string").Value(ConvertToYsonString(config))
2626+
.EndMap();
2627+
2628+
Deserialize(value, node->AsMap());
2629+
EXPECT_TRUE(value.MyString);
2630+
2631+
auto extracted = ConvertTo<TTestConfigPtr>(value.MyString);
2632+
EXPECT_EQ(extracted->NullableInt, config->NullableInt);
2633+
EXPECT_EQ(extracted->MyString, extracted->MyString);
2634+
}
2635+
}
2636+
2637+
TEST(TYsonStructTest, TYsonStringFieldCompound)
2638+
{
2639+
TWithYsonString value;
2640+
2641+
auto config = New<TTestConfig>();
2642+
config->MyString = "Hello, world!";
2643+
2644+
auto node = BuildYsonNodeFluently()
2645+
.BeginMap()
2646+
.Item("my_string").Value(ConvertToYsonString(config))
2647+
.EndMap();
2648+
2649+
Deserialize(value, node->AsMap());
2650+
EXPECT_TRUE(value.MyString);
2651+
2652+
auto extracted = ConvertTo<TTestConfigPtr>(value.MyString);
2653+
EXPECT_EQ(extracted->NullableInt, config->NullableInt);
2654+
EXPECT_EQ(extracted->MyString, extracted->MyString);
2655+
}
2656+
25772657
////////////////////////////////////////////////////////////////////////////////
25782658

25792659
struct TPolyBase

yt/yt/core/ytree/yson_struct_detail-inl.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
#include <yt/yt/core/yson/token_writer.h>
1212

13+
#include <library/cpp/yt/yson_string/string.h>
14+
1315
#include <library/cpp/yt/misc/wrapper_traits.h>
1416

1517
namespace NYT::NYTree {
@@ -225,6 +227,24 @@ void LoadFromSource(
225227
}
226228
}
227229

230+
// TYsonString
231+
template <CYsonStructSource TSource>
232+
void LoadFromSource(
233+
::NYT::NYson::TYsonString& parameter,
234+
TSource source,
235+
const NYPath::TYPath& path,
236+
std::optional<EUnrecognizedStrategy> /*ignored*/)
237+
{
238+
using TTraits = TYsonSourceTraits<TSource>;
239+
240+
try {
241+
parameter = NYson::ConvertToYsonString(TTraits::AsNode(source));
242+
} catch (const std::exception& ex) {
243+
THROW_ERROR_EXCEPTION("Error loading parameter %v", path)
244+
<< ex;
245+
}
246+
}
247+
228248
// INodePtr
229249
template <CYsonStructSource TSource>
230250
void LoadFromSource(

0 commit comments

Comments
 (0)