aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/yaml/fyamlcpp
diff options
context:
space:
mode:
authorinnokentii <innokentii@yandex-team.com>2023-05-05 18:48:20 +0300
committerinnokentii <innokentii@yandex-team.com>2023-05-05 18:48:20 +0300
commit4ff405d38632f38b90d7b84f3ce016ba967687be (patch)
tree3cf96a2c2bf6a1ea51cbb8e8e8daa20e4a1bd097 /library/cpp/yaml/fyamlcpp
parent64af0242391e232daff8da23ef1020a311d65ce5 (diff)
downloadydb-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.cpp40
-rw-r--r--library/cpp/yaml/fyamlcpp/fyamlcpp.h4
-rw-r--r--library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp19
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"));
+ }
}