diff options
author | innokentii <innokentii@yandex-team.com> | 2023-05-05 18:48:20 +0300 |
---|---|---|
committer | innokentii <innokentii@yandex-team.com> | 2023-05-05 18:48:20 +0300 |
commit | 4ff405d38632f38b90d7b84f3ce016ba967687be (patch) | |
tree | 3cf96a2c2bf6a1ea51cbb8e8e8daa20e4a1bd097 /library/cpp/yaml/fyamlcpp | |
parent | 64af0242391e232daff8da23ef1020a311d65ce5 (diff) | |
download | ydb-4ff405d38632f38b90d7b84f3ce016ba967687be.tar.gz |
Add utils for scalar modification in fyaml
add utils for scalar modification in fyaml
Diffstat (limited to 'library/cpp/yaml/fyamlcpp')
-rw-r--r-- | library/cpp/yaml/fyamlcpp/fyamlcpp.cpp | 40 | ||||
-rw-r--r-- | library/cpp/yaml/fyamlcpp/fyamlcpp.h | 4 | ||||
-rw-r--r-- | library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp | 19 |
3 files changed, 63 insertions, 0 deletions
diff --git a/library/cpp/yaml/fyamlcpp/fyamlcpp.cpp b/library/cpp/yaml/fyamlcpp/fyamlcpp.cpp index 9ddf434e97b..dc6caaf7267 100644 --- a/library/cpp/yaml/fyamlcpp/fyamlcpp.cpp +++ b/library/cpp/yaml/fyamlcpp/fyamlcpp.cpp @@ -318,6 +318,46 @@ TString TNodeRef::Scalar() const { return TString(text, size); } +TMark TNodeRef::ScalarBeginMark() const { + ENSURE_NODE_NOT_EMPTY(Node_); + Y_ENSURE_EX(fy_node_is_scalar(Node_), TFyamlEx() << "Node is not Scalar: " << Path()); + std::unique_ptr<fy_document_iterator, void(*)(fy_document_iterator*)> it( + fy_document_iterator_create(), + &fy_document_iterator_destroy); + fy_document_iterator_node_start(it.get(), Node_); + auto deleter = [&](fy_event* fye){ fy_document_iterator_event_free(it.get(), fye); }; + std::unique_ptr<fy_event, decltype(deleter)> ev( + fy_document_iterator_body_next(it.get()), + deleter); + auto* token = fy_event_get_token(ev.get()); + auto* mark = fy_token_start_mark(token); + return TMark{ + mark->input_pos, + mark->line, + mark->column, + }; +} + +TMark TNodeRef::ScalarEndMark() const { + ENSURE_NODE_NOT_EMPTY(Node_); + Y_ENSURE_EX(fy_node_is_scalar(Node_), TFyamlEx() << "Node is not Scalar: " << Path()); + std::unique_ptr<fy_document_iterator, void(*)(fy_document_iterator*)> it( + fy_document_iterator_create(), + &fy_document_iterator_destroy); + fy_document_iterator_node_start(it.get(), Node_); + auto deleter = [&](fy_event* fye){ fy_document_iterator_event_free(it.get(), fye); }; + std::unique_ptr<fy_event, decltype(deleter)> ev( + fy_document_iterator_body_next(it.get()), + deleter); + auto* token = fy_event_get_token(ev.get()); + auto* mark = fy_token_end_mark(token); + return TMark{ + mark->input_pos, + mark->line, + mark->column, + }; +} + TMapping TNodeRef::Map() const { ENSURE_NODE_NOT_EMPTY(Node_); Y_ENSURE_EX(fy_node_is_mapping(Node_), TFyamlEx() << "Node is not Mapping: " << Path()); diff --git a/library/cpp/yaml/fyamlcpp/fyamlcpp.h b/library/cpp/yaml/fyamlcpp/fyamlcpp.h index 231503c3a1f..7044a010a7d 100644 --- a/library/cpp/yaml/fyamlcpp/fyamlcpp.h +++ b/library/cpp/yaml/fyamlcpp/fyamlcpp.h @@ -150,6 +150,10 @@ public: TString Scalar() const; + TMark ScalarBeginMark() const; + + TMark ScalarEndMark() const; + void Insert(const TNodeRef& node); bool Empty() const { return Node_ == nullptr; } diff --git a/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp b/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp index 708554a7084..299fe614a2d 100644 --- a/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp +++ b/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp @@ -163,4 +163,23 @@ x: b UNIT_ASSERT_VALUES_EQUAL(seq[1].Map().at("b").Sequence().at(1).Scalar(), "2"); UNIT_ASSERT_VALUES_EQUAL(seq[1].Map().at("b").Sequence().at(2).Scalar(), "3"); } + + Y_UNIT_TEST(ScalarMark) { + TString str = R"( +a: foo +test: [{obj: 123}] +b: bar + )"; + + auto doc = NFyaml::TDocument::Parse(str); + + auto node = doc.Root().Map().at("test").Sequence().at(0).Map().at("obj"); + + auto pos = str.find("123"); + auto begin = node.ScalarBeginMark().InputPos; + auto end = node.ScalarEndMark().InputPos; + + UNIT_ASSERT_VALUES_EQUAL(begin, pos); + UNIT_ASSERT_VALUES_EQUAL(end, pos + strlen("123")); + } } |