diff options
author | innokentii <innokentii@ydb.tech> | 2023-12-06 12:17:20 +0300 |
---|---|---|
committer | innokentii <innokentii@ydb.tech> | 2023-12-06 12:55:01 +0300 |
commit | e7fda6595937cda061fdefb21d18d2b1f92a9841 (patch) | |
tree | 09aaa4155c147eba0a6af1de860d43d5854129ca | |
parent | e83c481c67c6d22053de832f656e049faeab0f80 (diff) | |
download | ydb-e7fda6595937cda061fdefb21d18d2b1f92a9841.tar.gz |
Fix ut
fix ut
-rw-r--r-- | library/cpp/yaml/fyamlcpp/fyamlcpp.cpp | 1126 | ||||
-rw-r--r-- | library/cpp/yaml/fyamlcpp/fyamlcpp.h | 939 | ||||
-rw-r--r-- | library/cpp/yaml/fyamlcpp/ya.make | 16 | ||||
-rw-r--r-- | ydb/library/fyamlcpp/fyamlcpp_ut.cpp (renamed from library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp) | 0 | ||||
-rw-r--r-- | ydb/library/fyamlcpp/libfyaml_ut.cpp (renamed from library/cpp/yaml/fyamlcpp/libfyaml_ut.cpp) | 0 | ||||
-rw-r--r-- | ydb/library/fyamlcpp/ut/ya.make | 2 |
6 files changed, 1 insertions, 2082 deletions
diff --git a/library/cpp/yaml/fyamlcpp/fyamlcpp.cpp b/library/cpp/yaml/fyamlcpp/fyamlcpp.cpp deleted file mode 100644 index cf5d01ef70..0000000000 --- a/library/cpp/yaml/fyamlcpp/fyamlcpp.cpp +++ /dev/null @@ -1,1126 +0,0 @@ -#include "fyamlcpp.h" - -#include <contrib/libs/libfyaml/include/libfyaml.h> - -#include <util/digest/murmur.h> - -namespace NFyaml { - -const char* zstr = ""; - -enum class EErrorType { - Debug = FYET_DEBUG, - Info = FYET_INFO, - Notice = FYET_NOTICE, - Warning = FYET_WARNING, - Error = FYET_ERROR, - Max = FYET_MAX, -}; - -enum class EErrorModule { - Unknown = FYEM_UNKNOWN, - Atom = FYEM_ATOM, - Scan = FYEM_SCAN, - Parse = FYEM_PARSE, - Doc = FYEM_DOC, - Build = FYEM_BUILD, - Internal = FYEM_INTERNAL, - System = FYEM_SYSTEM, - Max = FYEM_MAX, -}; - -enum class EParseCfgFlags { - Quiet = FYPCF_QUIET, - CollectDiag = FYPCF_COLLECT_DIAG, - ResolveDocument = FYPCF_RESOLVE_DOCUMENT, - DisableMmapOpt = FYPCF_DISABLE_MMAP_OPT, - DisableRecycling = FYPCF_DISABLE_RECYCLING, - ParseComments = FYPCF_PARSE_COMMENTS, - DisableDepth_limit = FYPCF_DISABLE_DEPTH_LIMIT, - DisableAccelerators = FYPCF_DISABLE_ACCELERATORS, - DisableBuffering = FYPCF_DISABLE_BUFFERING, - DefaultVersionAuto = FYPCF_DEFAULT_VERSION_AUTO, - DefaultVersion1_1 = FYPCF_DEFAULT_VERSION_1_1, - DefaultVersion1_2 = FYPCF_DEFAULT_VERSION_1_2, - DefaultVersion1_3 = FYPCF_DEFAULT_VERSION_1_3, - SloppyFlowIndentation = FYPCF_SLOPPY_FLOW_INDENTATION, - PreferRecursive = FYPCF_PREFER_RECURSIVE, - JsonAuto = FYPCF_JSON_AUTO, - JsonNone = FYPCF_JSON_NONE, - JsonForce = FYPCF_JSON_FORCE, - YpathAliases = FYPCF_YPATH_ALIASES, - AllowDuplicateKeys = FYPCF_ALLOW_DUPLICATE_KEYS, -}; - -enum class EEventType { - None = FYET_NONE, - StreamStart = FYET_STREAM_START, - StreamEnd = FYET_STREAM_END, - DocumentStart = FYET_DOCUMENT_START, - DocumentEnd = FYET_DOCUMENT_END, - MappingStart = FYET_MAPPING_START, - MappingEnd = FYET_MAPPING_END, - SequenceStart = FYET_SEQUENCE_START, - SequenceEnd = FYET_SEQUENCE_END, - Scalar = FYET_SCALAR, - Alias = FYET_ALIAS, -}; - -enum class EScalarStyle { - Any = FYSS_ANY, - Plain = FYSS_PLAIN, - SingleQuoted = FYSS_SINGLE_QUOTED, - DoubleQuoted = FYSS_DOUBLE_QUOTED, - Literal = FYSS_LITERAL, - Folded = FYSS_FOLDED, - Max = FYSS_MAX, -}; - -enum class EEmitterWriteType { - DocumentIndicator = fyewt_document_indicator, - TagDirective = fyewt_tag_directive, - VersionDirective = fyewt_version_directive, - Indent = fyewt_indent, - Indicator = fyewt_indicator, - Whitespace = fyewt_whitespace, - PlainScalar = fyewt_plain_scalar, - SingleQuotedScalar = fyewt_single_quoted_scalar, - DoubleQuotedScalar = fyewt_double_quoted_scalar, - LiteralScalar = fyewt_literal_scalar, - FoldedScalar = fyewt_folded_scalar, - Anchor = fyewt_anchor, - Tag = fyewt_tag, - Linebreak = fyewt_linebreak, - Alias = fyewt_alias, - TerminatingZero = fyewt_terminating_zero, - PlainScalarKey = fyewt_plain_scalar_key, - SingleQuotedScalarKey = fyewt_single_quoted_scalar_key, - DoubleQuotedScalarKey = fyewt_double_quoted_scalar_key, - Comment = fyewt_comment, -}; - -enum class ECommentPlacement { - Top = fycp_top, - Right = fycp_right, - Bottom = fycp_bottom, -}; - -enum EEmitterCfgFlags { - SortKeys = FYECF_SORT_KEYS, - OutputComments = FYECF_OUTPUT_COMMENTS, - StripLabels = FYECF_STRIP_LABELS, - StripTags = FYECF_STRIP_TAGS, - StripDoc = FYECF_STRIP_DOC, - NoEndingNewline = FYECF_NO_ENDING_NEWLINE, - StripEmptyKv = FYECF_STRIP_EMPTY_KV, - IndentDefault = FYECF_INDENT_DEFAULT, - Indent1 = FYECF_INDENT_1, - Indent2 = FYECF_INDENT_2, - Indent3 = FYECF_INDENT_3, - Indent4 = FYECF_INDENT_4, - Indent5 = FYECF_INDENT_5, - Indent6 = FYECF_INDENT_6, - Indent7 = FYECF_INDENT_7, - Indent8 = FYECF_INDENT_8, - Indent9 = FYECF_INDENT_9, - WidthDefault = FYECF_WIDTH_DEFAULT, - Width80 = FYECF_WIDTH_80, - Width132 = FYECF_WIDTH_132, - WidthInf = FYECF_WIDTH_INF, - ModeOriginal = FYECF_MODE_ORIGINAL, - ModeBlock = FYECF_MODE_BLOCK, - ModeFlow = FYECF_MODE_FLOW, - ModeFlowOneline = FYECF_MODE_FLOW_ONELINE, - ModeJson = FYECF_MODE_JSON, - ModeJsonTp = FYECF_MODE_JSON_TP, - ModeJsonOneline = FYECF_MODE_JSON_ONELINE, - ModeDejson = FYECF_MODE_DEJSON, - ModePretty = FYECF_MODE_PRETTY, - DocStartMarkAuto = FYECF_DOC_START_MARK_AUTO, - DocStartMarkOff = FYECF_DOC_START_MARK_OFF, - DocStartMarkOn = FYECF_DOC_START_MARK_ON, - DocEndMarkAuto = FYECF_DOC_END_MARK_AUTO, - DocEndMarkOff = FYECF_DOC_END_MARK_OFF, - DocEndMarkOn = FYECF_DOC_END_MARK_ON, - VersionDirAuto = FYECF_VERSION_DIR_AUTO, - VersionDirOff = FYECF_VERSION_DIR_OFF, - VersionDirOn = FYECF_VERSION_DIR_ON, - TagDirAuto = FYECF_TAG_DIR_AUTO, - TagDirOff = FYECF_TAG_DIR_OFF, - TagDirOn = FYECF_TAG_DIR_ON, - - Default = FYECF_DEFAULT, -}; - -enum class ENodeWalkFlags { - DontFollow = FYNWF_DONT_FOLLOW, - Follow = FYNWF_FOLLOW, - PtrYaml = FYNWF_PTR_YAML, - PtrJson = FYNWF_PTR_JSON, - PtrReljson = FYNWF_PTR_RELJSON, - PtrYpath = FYNWF_PTR_YPATH, - UriEncoded = FYNWF_URI_ENCODED, - MaxdepthDefault = FYNWF_MAXDEPTH_DEFAULT, - MarkerDefault = FYNWF_MARKER_DEFAULT, - PtrDefault = FYNWF_PTR_DEFAULT, -}; - -enum class EPathParseCfgFlags { - Quiet = FYPPCF_QUIET, - DisableRecycling = FYPPCF_DISABLE_RECYCLING, - DisableAccelerators = FYPPCF_DISABLE_ACCELERATORS, -}; - -enum class EPathExecCfgFlags { - Quiet = FYPXCF_QUIET, - DisableRecycling = FYPXCF_DISABLE_RECYCLING, - DisableAccelerators = FYPXCF_DISABLE_ACCELERATORS, -}; - -enum class ETokenType { - /* non-content token types */ - None = FYTT_NONE, - StreamStart = FYTT_STREAM_START, - StreamEnd = FYTT_STREAM_END, - VersionDirective = FYTT_VERSION_DIRECTIVE, - TagDirective = FYTT_TAG_DIRECTIVE, - DocumentStart = FYTT_DOCUMENT_START, - DocumentEnd = FYTT_DOCUMENT_END, - /* content token types */ - BlockSequenceStart = FYTT_BLOCK_SEQUENCE_START, - BlockMappingStart = FYTT_BLOCK_MAPPING_START, - BlockEnd = FYTT_BLOCK_END, - FlowSequenceStart = FYTT_FLOW_SEQUENCE_START, - FlowSequenceEnd = FYTT_FLOW_SEQUENCE_END, - FlowMappingStart = FYTT_FLOW_MAPPING_START, - FlowMappingEnd = FYTT_FLOW_MAPPING_END, - BlockEntry = FYTT_BLOCK_ENTRY, - FlowEntry = FYTT_FLOW_ENTRY, - Key = FYTT_KEY, - Value = FYTT_VALUE, - Alias = FYTT_ALIAS, - Anchor = FYTT_ANCHOR, - Tag = FYTT_TAG, - Scalar = FYTT_SCALAR, - - /* special error reporting */ - Input_marker = FYTT_INPUT_MARKER, - - /* path expression tokens */ - PeSlash = FYTT_PE_SLASH, - PeRoot = FYTT_PE_ROOT, - PeThis = FYTT_PE_THIS, - PeParent = FYTT_PE_PARENT, - PeMapKey = FYTT_PE_MAP_KEY, - PeSeqIndex = FYTT_PE_SEQ_INDEX, - PeSeqSlice = FYTT_PE_SEQ_SLICE, - PeScalarFilter = FYTT_PE_SCALAR_FILTER, - PeCollectionFilter = FYTT_PE_COLLECTION_FILTER, - PeSeqFilter = FYTT_PE_SEQ_FILTER, - PeMapFilter = FYTT_PE_MAP_FILTER, - PeUniqueFilter = FYTT_PE_UNIQUE_FILTER, - PeEveryChild = FYTT_PE_EVERY_CHILD, - PeEveryChildR = FYTT_PE_EVERY_CHILD_R, - PeAlias = FYTT_PE_ALIAS, - PeSibling = FYTT_PE_SIBLING, - PeComma = FYTT_PE_COMMA, - PeBarbar = FYTT_PE_BARBAR, - PeAmpamp = FYTT_PE_AMPAMP, - PeLparen = FYTT_PE_LPAREN, - PeRparen = FYTT_PE_RPAREN, - - /* comparison operators */ - PeEqeq = FYTT_PE_EQEQ, - PeNoteq = FYTT_PE_NOTEQ, - PeLt = FYTT_PE_LT, - PeGt = FYTT_PE_GT, - PeLte = FYTT_PE_LTE, - PeGte = FYTT_PE_GTE, - - /* scalar expression tokens */ - SePlus = FYTT_SE_PLUS, - SeMinus = FYTT_SE_MINUS, - SeMult = FYTT_SE_MULT, - SeDiv = FYTT_SE_DIV, - - PeMethod = FYTT_PE_METHOD, - SeMethod = FYTT_SE_METHOD, -}; - -enum class EComposerReturn { - OkContinue = FYCR_OK_CONTINUE, - OkStop = FYCR_OK_STOP, - OkStartSkip = FYCR_OK_START_SKIP, - OkStopSkip = FYCR_OK_STOP_SKIP, - Error = FYCR_ERROR, -}; - -TDocumentIterator::TDocumentIterator(fy_document_iterator* iterator) - : Iterator_(iterator, fy_document_iterator_destroy) -{} - -TNodeRef::TNodeRef(fy_node* node) - : Node_(node) -{} - -fy_node* TNodeRef::NodeRawPointer() const { - return Node_; -} - -TNode& TNode::operator=(fy_node* node) { - Node_.reset(node, fy_node_free); - return *this; -} - -TNode::TNode(fy_node* node) - : Node_(node, fy_node_free) -{} - -TNodeRef TNodePairRef::Key() const { - ENSURE_NODE_NOT_EMPTY(Pair_); - return TNodeRef(fy_node_pair_key(Pair_)); -} - -int TNodePairRef::Index(const TNodeRef& node) const { - ENSURE_NODE_NOT_EMPTY(node); - ENSURE_NODE_NOT_EMPTY(Pair_); - return fy_node_mapping_get_pair_index(node.Node_, Pair_); -} - -void TNodePairRef::SetKey(const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Pair_); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_pair_set_key(Pair_, node.Node_), Pair_); -} - -TNodeRef TNodePairRef::Value() const { - ENSURE_NODE_NOT_EMPTY(Pair_); - return TNodeRef(fy_node_pair_value(Pair_)); -} - -void TNodePairRef::SetValue(const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Pair_); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_pair_set_value(Pair_, node.Node_), Pair_); -} - -TMappingIterator::TMappingIterator(const TNodeRef& node, bool end) - : Node_(node) -{ - if (!end) { - NodePair_ = TNodePairRef(fy_node_mapping_iterate(Node_.Node_, reinterpret_cast<void**>(&NodePair_.Pair_))); - } -} - -TMappingIterator& TMappingIterator::operator++() { - NodePair_ = TNodePairRef(fy_node_mapping_iterate(Node_.Node_, reinterpret_cast<void**>(&NodePair_.Pair_))); - return *this; -} - -TReverseMappingIterator::TReverseMappingIterator(const TNodeRef& node, bool end) - : Node_(node) -{ - if (!end) { - NodePair_ = TNodePairRef(fy_node_mapping_reverse_iterate(Node_.Node_, reinterpret_cast<void**>(&NodePair_.Pair_))); - } -} - -TReverseMappingIterator& TReverseMappingIterator::operator++() { - NodePair_ = TNodePairRef(fy_node_mapping_reverse_iterate(Node_.Node_, reinterpret_cast<void**>(&NodePair_.Pair_))); - return *this; -} - -size_t TMapping::size() const { - ENSURE_NODE_NOT_EMPTY(Node_); - return fy_node_mapping_item_count(Node_); -} - -size_t TMapping::empty() const { - ENSURE_NODE_NOT_EMPTY(Node_); - return fy_node_mapping_is_empty(Node_); -} - -TNodePairRef TMapping::at(int index) const { - ENSURE_NODE_NOT_EMPTY(Node_); - auto res = fy_node_mapping_get_by_index(Node_, index); - Y_ENSURE_EX(res, ({ - TStringStream ss; - ss << "No such child: " << Path() << "/" << index; - TFyamlEx(ss.Str()); - })); - return TNodePairRef(res); -} - -TNodePairRef TMapping::operator[](int index) const { - ENSURE_NODE_NOT_EMPTY(Node_); - return TNodePairRef(fy_node_mapping_get_by_index(Node_, index)); -} - -TNodeRef TMapping::at(const TString& index) const { - ENSURE_NODE_NOT_EMPTY(Node_); - auto res = fy_node_mapping_lookup_by_string(Node_, index.data(), index.size()); - Y_ENSURE_EX(res, ({ - TStringStream ss; - ss << "No such child: " << Path() << "/" << index; - TFyamlEx(ss.Str()); - })); - return TNodeRef(res); -} - -TNodePairRef TMapping::pair_at(const TString& index) const { - ENSURE_NODE_NOT_EMPTY(Node_); - auto res = fy_node_mapping_lookup_pair_by_string(Node_, index.data(), index.size()); - Y_ENSURE_EX(res, ({ - TStringStream ss; - ss << "No such child: " << Path() << "/" << index; - TFyamlEx(ss.Str()); - })); - return TNodePairRef(res); -} - -TNodePairRef TMapping::pair_at_opt(const TString& index) const { - ENSURE_NODE_NOT_EMPTY(Node_); - return TNodePairRef(fy_node_mapping_lookup_pair_by_string(Node_, index.data(), index.size())); -} - -TNodeRef TMapping::operator[](const TString& index) const { - ENSURE_NODE_NOT_EMPTY(Node_); - return TNodeRef(fy_node_mapping_lookup_by_string(Node_, index.data(), index.size())); -} - -TNodeRef TMapping::operator[](const char* str) const { - ENSURE_NODE_NOT_EMPTY(Node_); - TString index(str); - return TNodeRef(fy_node_mapping_lookup_by_string(Node_, index.data(), index.size())); -} - -void TMapping::Append(const TNodeRef& key, const TNodeRef& value) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(key); - ENSURE_NODE_NOT_EMPTY(value); - NDetail::RethrowOnError(fy_node_mapping_append(Node_, key.Node_, value.Node_), Node_); -} - -void TMapping::Prepend(const TNodeRef& key, const TNodeRef& value) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(key); - ENSURE_NODE_NOT_EMPTY(value); - NDetail::RethrowOnError(fy_node_mapping_prepend(Node_, key.Node_, value.Node_), Node_); -} - -void TMapping::Remove(const TNodePairRef& toRemove) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(toRemove); - NDetail::RethrowOnError(fy_node_mapping_remove(Node_, toRemove.Pair_), Node_); - fy_node_free(fy_node_pair_key(toRemove.Pair_)); - fy_node_free(fy_node_pair_value(toRemove.Pair_)); - free(toRemove.Pair_); -} - -bool TMapping::Has(TString key) const { - return fy_node_mapping_lookup_by_string(Node_, key.data(), key.size()) != nullptr; -} - -TMappingIterator TMapping::Remove(const TMappingIterator& toRemove) { - ENSURE_NODE_NOT_EMPTY(Node_); - Y_DEBUG_ABORT_UNLESS(Node_ == toRemove.Node_); - TMappingIterator ret = toRemove; - ++ret; - fy_node_mapping_remove(Node_, toRemove.NodePair_.Pair_); - return ret; -} - -void TMapping::Remove(const TNodeRef& key) { - ENSURE_NODE_NOT_EMPTY(Node_); - fy_node_free(fy_node_mapping_remove_by_key(Node_, key.Node_)); -} - -TSequenceIterator::TSequenceIterator(const TNodeRef& node, bool end) - : Node_(node) -{ - if (!end) { - IterNode_ = TNodeRef(fy_node_sequence_iterate(Node_.Node_, &Iter_)); - } -} - -TSequenceIterator& TSequenceIterator::operator++() { - IterNode_ = TNodeRef(fy_node_sequence_iterate(Node_.Node_, &Iter_)); - return *this; -} - -void TSequenceIterator::InsertBefore(const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(IterNode_); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_sequence_insert_before(Node_.Node_, IterNode_.Node_, node.Node_), Node_.Node_); -} - -void TSequenceIterator::InsertAfter(const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(IterNode_); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_sequence_insert_after(Node_.Node_, IterNode_.Node_, node.Node_), Node_.Node_); -} - -TReverseSequenceIterator::TReverseSequenceIterator(const TNodeRef& node, bool end) - : Node_(node) -{ - if (!end) { - IterNode_ = TNodeRef(fy_node_sequence_reverse_iterate(Node_.Node_, &Iter_)); - } -} - -TReverseSequenceIterator& TReverseSequenceIterator::operator++() { - IterNode_ = TNodeRef(fy_node_sequence_reverse_iterate(Node_.Node_, &Iter_)); - return *this; -} - -void TReverseSequenceIterator::InsertBefore(const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(IterNode_); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_sequence_insert_after(Node_.Node_, IterNode_.Node_, node.Node_), Node_.Node_); -} - -void TReverseSequenceIterator::InsertAfter(const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(IterNode_); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_sequence_insert_before(Node_.Node_, IterNode_.Node_, node.Node_), Node_.Node_); -} - -size_t TSequence::size() const { - ENSURE_NODE_NOT_EMPTY(Node_); - return fy_node_sequence_item_count(Node_); -} - -size_t TSequence::empty() const { - ENSURE_NODE_NOT_EMPTY(Node_); - return fy_node_sequence_is_empty(Node_); -} - -TNodeRef TSequence::at(int index) const { - ENSURE_NODE_NOT_EMPTY(Node_); - auto res = fy_node_sequence_get_by_index(Node_, index); - Y_ENSURE_EX(res, ({ - TStringStream ss; - ss << "No such index: " << Path() << "/" << index; - TFyamlEx(ss.Str()); - })); - return TNodeRef(res); -} - -TNodeRef TSequence::operator[](int index) const { - ENSURE_NODE_NOT_EMPTY(Node_); - return TNodeRef(fy_node_sequence_get_by_index(Node_, index)); -} - -void TSequence::Append(const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_sequence_append(Node_, node.Node_), Node_); -} - -void TSequence::Prepend(const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_sequence_prepend(Node_, node.Node_), Node_); -} - -void TSequence::InsertBefore(const TNodeRef& mark, const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(mark); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_sequence_insert_before(Node_, mark.Node_, node.Node_), Node_); -} - -void TSequence::InsertAfter(const TNodeRef& mark, const TNodeRef& node) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(mark); - ENSURE_NODE_NOT_EMPTY(node); - NDetail::RethrowOnError(fy_node_sequence_insert_after(Node_, mark.Node_, node.Node_), Node_); -} - -TNode TSequence::Remove(const TNodeRef& toRemove) { - ENSURE_NODE_NOT_EMPTY(Node_); - ENSURE_NODE_NOT_EMPTY(toRemove.Node_); - return TNode(fy_node_sequence_remove(Node_, toRemove.Node_)); -} - -TSequenceIterator TSequence::Remove(const TSequenceIterator& toRemove) { - ENSURE_NODE_NOT_EMPTY(Node_); - Y_DEBUG_ABORT_UNLESS(Node_ == toRemove.Node_); - ENSURE_NODE_NOT_EMPTY(toRemove.IterNode_); - TSequenceIterator ret = toRemove; - ++ret; - fy_node_sequence_remove(Node_, toRemove.IterNode_.Node_); - fy_node_free(toRemove.IterNode_.Node_); // TODO add extract - return ret; -} - -TReverseSequenceIterator TSequence::Remove(const TReverseSequenceIterator& toRemove) { - ENSURE_NODE_NOT_EMPTY(Node_); - Y_DEBUG_ABORT_UNLESS(Node_ == toRemove.Node_); - ENSURE_NODE_NOT_EMPTY(toRemove.IterNode_); - TReverseSequenceIterator ret = toRemove; - ++ret; - fy_node_sequence_remove(Node_, toRemove.IterNode_.Node_); - fy_node_free(toRemove.IterNode_.Node_); // TODO add extract - return ret; -} - -TDocumentNodeIterator::TDocumentNodeIterator(TNodeRef&& node) - : Node_(node) -{ - if (node) { - Iterator_ = {fy_document_iterator_create(), fy_document_iterator_destroy}; - fy_document_iterator_node_start(Iterator_.get(), node.Node_); - } -} - -TDocumentNodeIterator& TDocumentNodeIterator::operator++() { - Node_ = fy_document_iterator_node_next(Iterator_.get()); - return *this; -} - -TDocument::TDocument(TString str, fy_document* doc, fy_diag* diag) - : Document_(doc, fy_document_destroy) - , Diag_(diag, fy_diag_destroy) -{ - auto* userdata = new THashSet<TSimpleSharedPtr<TString>, TStringPtrHashT>({MakeSimpleShared<TString>(std::move(str))}); - fy_document_set_userdata(doc, userdata); - fy_document_register_on_destroy(doc, &DestroyDocumentStrings); - RegisterUserDataCleanup(); -} - -TDocument::TDocument(fy_document* doc, fy_diag* diag) - : Document_(doc, fy_document_destroy) - , Diag_(diag, fy_diag_destroy) -{ - RegisterUserDataCleanup(); -} - -TDocument TDocument::Parse(TString str) { - const char* cstr = str.empty() ? zstr : str.cbegin(); - fy_diag_cfg dcfg; - fy_diag_cfg_default(&dcfg); - std::unique_ptr<fy_diag, void(*)(fy_diag*)> diag(fy_diag_create(&dcfg), fy_diag_destroy); - fy_diag_set_collect_errors(diag.get(), true); - fy_parse_cfg cfg{ - "", - // FYPCF_PARSE_COMMENTS, - FYPCF_QUIET, - nullptr, - diag.get() - }; - fy_document* doc = fy_document_build_from_string(&cfg, cstr, FY_NT); - if (!doc) { - NDetail::ThrowAllExceptionsIfAny(diag.get()); - } - return TDocument(std::move(str), doc, diag.release()); -} - -TDocument TDocument::Clone() const { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - fy_document* doc = fy_document_clone(Document_.get()); - fy_document_set_userdata( - doc, - new THashSet<TSimpleSharedPtr<TString>, TStringPtrHashT>( - *reinterpret_cast<THashSet<TSimpleSharedPtr<TString>, TStringPtrHashT>*>(fy_document_get_userdata(Document_.get())) - ) - ); - fy_document_register_on_destroy(doc, &DestroyDocumentStrings); - return TDocument(doc, fy_document_get_diag(doc)); -} - -void TDocument::InsertAt(const char* path, const TNodeRef& node) { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - NDetail::RethrowOnError(fy_document_insert_at(Document_.get(), path, FY_NT, node.Node_), Diag_.get()); -} - -TNodeRef TDocument::Buildf(const char* content) { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - return TNodeRef(fy_node_build_from_string(Document_.get(), content, strlen(content))); -} - -void TDocument::Resolve() { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - if (fy_document_resolve(Document_.get()) != 0) { - NDetail::ThrowAllExceptionsIfAny(Diag_.get()); - } -} - -bool TDocument::HasDirectives() { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - return fy_document_has_directives(Document_.get()); -} - -bool TDocument::HasExplicitDocumentStart() { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - return fy_document_has_explicit_document_start(Document_.get()); -} - -bool TDocument::HasExplicitDocumentEnd() { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - return fy_document_has_explicit_document_end(Document_.get()); -} - -void TDocument::SetParent(const TDocument& doc) { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - ENSURE_DOCUMENT_NOT_EMPTY(doc.Document_); - NDetail::RethrowOnError(fy_document_set_parent(doc.Document_.get(), Document_.release()), Diag_.get()); -} - -TNodeRef TDocument::Root() { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - return TNodeRef(fy_document_root(Document_.get())); -} - -void TDocument::SetRoot(const TNodeRef& node) { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - ENSURE_NODE_NOT_EMPTY(node.Node_); - NDetail::RethrowOnError(fy_document_set_root(Document_.get(), node.Node_), Diag_.get()); -} - -TNodeRef TDocument::CreateAlias(const TString& name) { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - return TNodeRef(fy_node_create_alias_copy(Document_.get(), name.c_str(), name.length())); -} - -std::unique_ptr<char, void(*)(char*)> TDocument::EmitToCharArray() const { - std::unique_ptr<char, void(*)(char*)> res( - fy_emit_document_to_string( - Document_.get(), - (fy_emitter_cfg_flags)(FYECF_DEFAULT | FYECF_MODE_PRETTY | FYECF_OUTPUT_COMMENTS)), &NDetail::FreeChar); - return res; -} - -bool TDocument::RegisterUserDataCleanup() { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - return fy_document_register_meta(Document_.get(), &DestroyUserData, nullptr) == 0; -} - -void TDocument::UnregisterUserDataCleanup() { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - fy_document_unregister_meta(Document_.get()); -} - -TMark TDocument::BeginMark() const { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - auto* fyds = fy_document_get_document_state(Document_.get()); - auto* mark = fy_document_state_start_mark(fyds); - return TMark{ - mark->input_pos, - mark->line, - mark->column, - }; -} - -TMark TDocument::EndMark() const { - ENSURE_DOCUMENT_NOT_EMPTY(Document_); - auto* fyds = fy_document_get_document_state(Document_.get()); - auto* mark = fy_document_state_end_mark(fyds); - return TMark{ - mark->input_pos, - mark->line, - mark->column, - }; -} - -std::unique_ptr<char, void(*)(char*)> TJsonEmitter::EmitToCharArray() const { - std::unique_ptr<char, void(*)(char*)> res( - fy_emit_node_to_string( - Node_.Node_, - (fy_emitter_cfg_flags)(FYECF_DEFAULT | FYECF_SORT_KEYS | FYECF_MODE_JSON_TP)), &NDetail::FreeChar); - return res; -} - -TParser::TParser(TString rawStream, fy_parser* parser, fy_diag* diag) - : RawDocumentStream_(std::move(rawStream)) - , Parser_(parser, fy_parser_destroy) - , Diag_(diag, fy_diag_destroy) -{} - -TParser TParser::Create(TString str) -{ - const char* stream = str.empty() ? zstr : str.cbegin(); - fy_diag_cfg dcfg; - fy_diag_cfg_default(&dcfg); - std::unique_ptr<fy_diag, void(*)(fy_diag*)> diag(fy_diag_create(&dcfg), fy_diag_destroy); - fy_diag_set_collect_errors(diag.get(), true); - fy_parse_cfg cfg{ - "", - // FYPCF_PARSE_COMMENTS, - FYPCF_QUIET, - nullptr, - diag.get() - }; - auto* parser = fy_parser_create(&cfg); - if (!parser) { - NDetail::ThrowAllExceptionsIfAny(diag.get()); - } - - fy_parser_set_string(parser, stream, -1); - - return TParser(std::move(str), parser, diag.release()); -} - -std::optional<TDocument> TParser::NextDocument() { - auto* doc = fy_parse_load_document(Parser_.get()); - if (!doc) { - return std::nullopt; - } - - return TDocument(RawDocumentStream_, doc, fy_document_get_diag(doc)); -} - -namespace NDetail { - -fy_node* TNodeOpsBase::CreateReference(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - return fy_node_create_reference(node); -} - -fy_node* TNodeOpsBase::Copy(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - return fy_node_copy(fy_node_document(node), node); -} - -fy_node* TNodeOpsBase::Copy(fy_node* node, fy_document* to) const { - ENSURE_NODE_NOT_EMPTY(node); - auto* fromDoc = fy_node_document(node); - auto& fromUserdata = *reinterpret_cast<THashSet<TSimpleSharedPtr<TString>, TStringPtrHashT>*>(fy_document_get_userdata(fromDoc)); - auto& toUserdata = *reinterpret_cast<THashSet<TSimpleSharedPtr<TString>, TStringPtrHashT>*>(fy_document_get_userdata(to)); - toUserdata.insert(fromUserdata.begin(), fromUserdata.end()); - return fy_node_copy(to, node); -} - -TString TNodeOpsBase::Path(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - char* path = fy_node_get_path(node); - - if (path) { - TString str(path); - free(path); - return str; - } - - return {}; -} - -ENodeType TNodeOpsBase::Type(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - return static_cast<ENodeType>(fy_node_get_type(node)); -} - -bool TNodeOpsBase::IsAlias(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - return fy_node_is_alias(node); -} - -fy_node* TNodeOpsBase::ResolveAlias(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - Y_DEBUG_ABORT_UNLESS(IsAlias(node)); - return fy_node_resolve_alias(node); -} - -TString TNodeOpsBase::Scalar(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - Y_ENSURE_EX(fy_node_is_scalar(node), TFyamlEx() << "Node is not Scalar: " << Path(node)); - size_t size; - const char* text = fy_node_get_scalar(node, &size); - return TString(text, size); -} - -TMark TNodeOpsBase::BeginMark(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - 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* mark = fy_event_start_mark(ev.get()); - - if (!mark) { - ythrow yexception() << "can't get begin mark for a node"; - } - - return TMark{ - mark->input_pos, - mark->line, - mark->column, - }; -} - -namespace { - -fy_event_type GetOpenEventType(ENodeType type) { - switch(type) { - case ENodeType::Mapping: - return FYET_MAPPING_START; - case ENodeType::Sequence: - return FYET_SEQUENCE_START; - default: - Y_ABORT("Not a brackets type"); - } -} - -fy_event_type GetCloseEventType(ENodeType type) { - switch(type) { - case ENodeType::Mapping: - return FYET_MAPPING_END; - case ENodeType::Sequence: - return FYET_SEQUENCE_END; - default: - Y_ABORT("Not a brackets type"); - } -} - -} // anonymous namespace - -TMark TNodeOpsBase::EndMark(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - 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)> prevEv( - nullptr, - deleter); - std::unique_ptr<fy_event, decltype(deleter)> ev( - fy_document_iterator_body_next(it.get()), - deleter); - - if (IsComplexType(Type(node))) { - int openBrackets = 0; - if (ev->type == GetOpenEventType(Type(node))) { - ++openBrackets; - } - if (ev->type == GetCloseEventType(Type(node))) { - --openBrackets; - } - while (ev->type != GetCloseEventType(Type(node)) || openBrackets != 0) { - std::unique_ptr<fy_event, decltype(deleter)> cur( - fy_document_iterator_body_next(it.get()), - deleter); - if (cur == nullptr) { - break; - } - if (cur->type == GetOpenEventType(Type(node))) { - ++openBrackets; - } - if (cur->type == GetCloseEventType(Type(node))) { - --openBrackets; - } - if (fy_event_get_node_style(cur.get()) != FYNS_BLOCK) { - prevEv.reset(ev.release()); - ev.reset(cur.release()); - } - } - } - - auto* mark = fy_event_end_mark(ev.get()); - - if (!mark && prevEv) { - mark = fy_event_end_mark(prevEv.get()); - } - - if (!mark) { - ythrow yexception() << "can't get end mark for a node"; - } - - return TMark{ - mark->input_pos, - mark->line, - mark->column, - }; -} - -fy_node* TNodeOpsBase::Map(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - Y_ENSURE_EX(fy_node_is_mapping(node), TFyamlEx() << "Node is not Mapping: " << Path(node)); - return node; -} - -fy_node* TNodeOpsBase::Sequence(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - Y_ENSURE_EX(fy_node_is_sequence(node), TFyamlEx() << "Node is not Sequence: " << Path(node)); - return node; -} - -void TNodeOpsBase::Insert(fy_node* thisNode, fy_node* node) { - ENSURE_NODE_NOT_EMPTY(node); - RethrowOnError(fy_node_insert(thisNode, node), thisNode); -} - -std::optional<TString> TNodeOpsBase::Tag(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - size_t len = 0; - const char* tag = fy_node_get_tag(node, &len); - - if (tag) { - return TString(tag, len); - } - - return std::nullopt; -} - -void TNodeOpsBase::SetTag(fy_node* node, const TString& tag) { - ENSURE_NODE_NOT_EMPTY(node); - auto* str = new TString(std::move(tag)); - auto* data = new TUserDataHolder(UserData(node), str); - SetUserData(node, data); - RethrowOnError(fy_node_set_tag(node, str->c_str(), str->length()), node); -} - -bool TNodeOpsBase::RemoveTag(fy_node* node) { - ENSURE_NODE_NOT_EMPTY(node); - bool ret = fy_node_remove_tag(node); - ClearUserData(node); - return ret; -} - -bool TNodeOpsBase::HasAnchor(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - return fy_node_get_anchor(node) != nullptr; -} - -void TNodeOpsBase::SetAnchor(fy_node* node, const TString& anchor) { - auto* str = new TString(anchor); - auto* data = new TUserDataHolder(UserData(node), str); - SetUserData(node, data); - RethrowOnError(fy_node_set_anchor(node, str->c_str(), str->length()), node); -} - -bool TNodeOpsBase::DeepEqual(fy_node* thisNode, fy_node* other) { - ENSURE_NODE_NOT_EMPTY(thisNode); - ENSURE_NODE_NOT_EMPTY(other); - return fy_node_compare(thisNode, other); -} - -std::unique_ptr<char, void(*)(char*)> TNodeOpsBase::EmitToCharArray(fy_node* node) const { - std::unique_ptr<char, void(*)(char*)> res( - fy_emit_node_to_string( - node, - (fy_emitter_cfg_flags)(FYECF_DEFAULT)), &FreeChar); - return res; -} - -void TNodeOpsBase::SetStyle(fy_node* node, ENodeStyle style) { - ENSURE_NODE_NOT_EMPTY(node); - fy_node_set_style(node, (enum fy_node_style)style); -} - -ENodeStyle TNodeOpsBase::Style(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - return (ENodeStyle)fy_node_get_style(node); -} - -void TNodeOpsBase::SetUserData(fy_node* node, IBasicUserData* data) { - ENSURE_NODE_NOT_EMPTY(node); - fy_node_set_meta(node, data); -} - -IBasicUserData* TNodeOpsBase::UserData(fy_node* node) const { - ENSURE_NODE_NOT_EMPTY(node); - return reinterpret_cast<IBasicUserData* >(fy_node_get_meta(node)); -} - -void TNodeOpsBase::ClearUserData(fy_node* node) { - ENSURE_NODE_NOT_EMPTY(node); - fy_node_clear_meta(node); -} - -void ThrowAllExceptionsIfAny(fy_diag* diag) { - void* iter = nullptr; - fy_diag_error* err = fy_diag_errors_iterate(diag, &iter); - if (err != nullptr) { - TStringStream ss; - ss << err->line << ":" << err->column << " " << err->msg; - TFyamlEx ex(ss.Str()); - - while ((err = fy_diag_errors_iterate(diag, &iter)) != nullptr) { - TStringStream ss; - ss << err->line << ":" << err->column << " " << err->msg; - ex.AddError(ss.Str()); - } - - ythrow ex; - } -} - -void RethrowError(fy_diag* diag) { - void *iter = nullptr; - fy_diag_error* err; - TStringStream ss; - while ((err = fy_diag_errors_iterate(diag, &iter)) != nullptr) { - ss << err->line << ":" << err->column << " " << err->msg << "\n"; - } - ythrow TFyamlEx(ss.Str()); -} - -void RethrowOnError(bool isError, fy_node* node) { - if (!isError) { - return; - } - - std::unique_ptr<fy_diag, void(*)(fy_diag*)> diag(fy_document_get_diag(fy_node_document(node)), fy_diag_unref); - RethrowError(diag.get()); -} - -void RethrowOnError(bool isError, fy_node_pair* pair) { - if (!isError) { - return; - } - - std::unique_ptr<fy_diag, void(*)(fy_diag*)> diag(fy_document_get_diag(fy_node_document(fy_node_pair_key(pair))), fy_diag_unref); - RethrowError(diag.get()); -} - -void RethrowOnError(bool isError, fy_diag* diag) { - if (!isError) { - return; - } - - RethrowError(diag); -} - -void FreeChar(char* mem) { - free(mem); -} - -bool IsComplexType(ENodeType type) { - return type == ENodeType::Mapping || type == ENodeType::Sequence; -} - -} // namespace NDetail - -} // namespace NFyaml - -template <> -void Out<NFyaml::TDocument>(IOutputStream& out, const NFyaml::TDocument& value) { - out << value.EmitToCharArray().get(); -} - -template <> -void Out<NFyaml::TNodeRef>(IOutputStream& out, const NFyaml::TNodeRef& value) { - out << value.EmitToCharArray().get(); -} - -template <> -void Out<NFyaml::TJsonEmitter>(IOutputStream& out, const NFyaml::TJsonEmitter& value) { - out << value.EmitToCharArray().get(); -} - -bool operator==(const fy_node* node1, const NFyaml::NDetail::TNodeOps<NFyaml::TNodeRef>& node2) { - return node2.Node() == node1; -} - -bool operator==(const fy_node* node1, const NFyaml::NDetail::TNodeOps<NFyaml::TNode>& node2) { - return node2.Node() == node1; -} diff --git a/library/cpp/yaml/fyamlcpp/fyamlcpp.h b/library/cpp/yaml/fyamlcpp/fyamlcpp.h deleted file mode 100644 index e205db7122..0000000000 --- a/library/cpp/yaml/fyamlcpp/fyamlcpp.h +++ /dev/null @@ -1,939 +0,0 @@ -#pragma once - -#include <util/generic/yexception.h> -#include <util/system/compiler.h> -#include <util/system/yassert.h> -#include <util/stream/str.h> -#include <util/generic/hash_set.h> -#include <util/generic/vector.h> - -#include <memory> -#include <optional> - -#define ENSURE_NODE_NOT_EMPTY(NODE) Y_ENSURE_EX(NODE, TFyamlEx() << "Expected non-empty Node") -#define ENSURE_DOCUMENT_NOT_EMPTY(NODE) Y_ENSURE_EX(NODE, TFyamlEx() << "Expected non-empty Document") - -struct fy_parser; -struct fy_node; -struct fy_document; -struct fy_diag; -struct fy_document_iterator; -struct fy_node_pair; -extern "C" struct fy_node *fy_node_buildf(struct fy_document *fyd, const char *fmt, ...); - -namespace NFyaml { - namespace NDetail { - template <class T> - class TNodeOps; - } - class TNodeRef; - class TNode; -} - -bool operator==(const fy_node* node1, const NFyaml::NDetail::TNodeOps<NFyaml::TNodeRef>& node2); -bool operator==(const fy_node* node1, const NFyaml::NDetail::TNodeOps<NFyaml::TNode>& node2); - -namespace NFyaml { - -struct TStringPtrHashT { - size_t operator()(const TSimpleSharedPtr<TString>& str) const { - return (size_t)str.Get(); - } -}; - -// do TFyaml(str) instead of TFyaml() << str; -class TFyamlEx : public yexception { -public: - TFyamlEx() {} - - TFyamlEx(TString error) : Errors_({error}) {} - - TFyamlEx(std::initializer_list<TString> errors) : Errors_(errors) {} - - const TVector<TString>& Errors() { - return Errors_; - } - - const char* what() const noexcept override { - What_ = TString(yexception::what()); - for (auto& err : Errors_) { - What_.push_back('\n'); - What_.append(err); - } - - return What_.c_str(); - } - - TFyamlEx& AddError(TString error) { - Errors_.push_back(error); - return *this; - } - - TStringBuf AsStrBuf() const { - return what(); - } - -private: - TVector<TString> Errors_; - mutable TString What_; -}; - -enum class ENodeType { - Scalar, - Sequence, - Mapping, -}; - -enum class ENodeStyle { - Any = -1, - Flow, - Block, - Plain, - SingleQuoted, - DoubleQuoted, - Literal, - Folded, - Alias, -}; - -class TNodeRef; -class TDocumentIterator; -class TDocument; -class TNode; -class TMappingIterator; -class TReverseMappingIterator; -class TMapping; -class TSequenceIterator; -class TReverseSequenceIterator; -class TSequence; -class TJsonEmitter; -class TParser; -struct TMark; - -namespace NDetail { - -class IBasicUserData { -public: - virtual ~IBasicUserData() = default; -}; - -template <class T> -class TUserDataHolder : public IBasicUserData { -public: - TUserDataHolder(IBasicUserData* next, T* data) - : Next_(next) - , Data_(data) - {} - -private: - std::unique_ptr<IBasicUserData> Next_ = nullptr; - std::unique_ptr<T> Data_ = nullptr; -}; - -void ThrowAllExceptionsIfAny(fy_diag* diag); - -void RethrowError(fy_diag* diag); - -void RethrowOnError(bool isError, fy_node* node); - -void RethrowOnError(bool isError, fy_node_pair* pair); - -void RethrowOnError(bool isError, fy_diag* diag); - -void FreeChar(char* mem); - -bool IsComplexType(ENodeType type); - -class TNodeOpsBase { -protected: - TString Path(fy_node* node) const; - - ENodeType Type(fy_node* node) const; - - fy_node* Copy(fy_node* node) const; - - fy_node* Copy(fy_node* node, fy_document* to) const; - - bool IsAlias(fy_node* node) const; - - fy_node* ResolveAlias(fy_node* node) const; - - fy_node* CreateReference(fy_node* node) const; - - fy_node* Sequence(fy_node* node) const; - - fy_node* Map(fy_node* node) const; - - TString Scalar(fy_node* node) const; - - TMark BeginMark(fy_node* node) const; - - TMark EndMark(fy_node* node) const; - - void Insert(fy_node* thisNode, fy_node* node); - - std::optional<TString> Tag(fy_node* node) const; - - void SetTag(fy_node* node, const TString& tag); - - bool RemoveTag(fy_node* node); - - bool HasAnchor(fy_node* node) const; - - void SetAnchor(fy_node* node, const TString& anchor); - - bool DeepEqual(fy_node* thisNode, fy_node* other); - - std::unique_ptr<char, void(*)(char*)> EmitToCharArray(fy_node* node) const; - - void SetStyle(fy_node* node, ENodeStyle style); - - ENodeStyle Style(fy_node* node) const; - -protected: - void SetUserData(fy_node* node, NDetail::IBasicUserData* data); - - NDetail::IBasicUserData* UserData(fy_node* node) const; - - void ClearUserData(fy_node* node); -}; - -template <class T> -class TNodeOps : public TNodeOpsBase { -friend class ::NFyaml::TNodeRef; - -public: - template <class OtherT> - bool operator==(const TNodeOps<OtherT>& other) const { return Node() == other.Node(); } - - bool operator==(const fy_node* node) const { return Node() == node; } - - friend bool ::operator==(const fy_node* node1, const TNodeOps<NFyaml::TNodeRef>& node2); - friend bool ::operator==(const fy_node* node1, const TNodeOps<NFyaml::TNode>& node2); - - explicit operator bool() const { return Node() != nullptr; } - - TString Path() const; - - ENodeType Type() const; - - TNode Copy() const; - - TNode Copy(TDocument& to) const; - - bool IsAlias() const; - - TNodeRef ResolveAlias() const; - - TNode CreateReference() const; - - TSequence Sequence() const; - - TMapping Map() const; - - TString Scalar() const; - - TMark BeginMark() const; - - TMark EndMark() const; - - void Insert(const TNodeRef& node); - - bool Empty() const { return Node() == nullptr; } - - std::optional<TString> Tag() const; - - void SetTag(const TString& tag); - - bool RemoveTag(); - - bool HasAnchor() const; - - void SetAnchor(const TString& anchor); - - bool DeepEqual(const TNodeRef& other); - - std::unique_ptr<char, void(*)(char*)> EmitToCharArray() const; - - void SetStyle(ENodeStyle style); - - ENodeStyle Style() const; - -protected: - const T& AsDerived() const; - - fy_node* Node() const; - - fy_node* Node(); - - void SetUserData(NDetail::IBasicUserData* data); - - NDetail::IBasicUserData* UserData() const; - - void ClearUserData(); -}; - -} // namespace NDetail - -class TDocumentIterator { - friend class TDocument; -public: - explicit TDocumentIterator(fy_document_iterator* iterator = nullptr); - -protected: - std::unique_ptr<fy_document_iterator, void(*)(fy_document_iterator*)> Iterator_; -}; - -class TNodeRef : public NDetail::TNodeOps<TNodeRef> { - friend class TNodeOps<TNodeRef>; - friend class TNodeOpsBase; - friend class TDocument; - friend class TDocumentNodeIterator; - friend class TMapping; - friend class TMappingIterator; - friend class TReverseMappingIterator; - friend class TNodePairRef; - friend class TSequence; - friend class TSequenceIterator; - friend class TReverseSequenceIterator; - friend class TJsonEmitter; - -public: - TNodeRef() = default; - - template <class T> - TNodeRef(const TNodeOps<T>& other) : Node_(other.Node()) {} - - explicit TNodeRef(const TNodeRef& other) : Node_(other.Node_) {} - - TNodeRef(fy_node* node); - - TNodeRef& operator=(const TNodeRef& other) { Node_ = other.Node_; return *this; } - - TNodeRef& operator=(fy_node* node) { Node_ = node; return *this; } - -protected: - fy_node* Node_ = nullptr; - -private: - fy_node* NodeRawPointer() const; -}; - -class TNode : public NDetail::TNodeOps<TNode> { - friend class TNodeOps<TNode>; - -public: - TNode(fy_node* node = nullptr); - - template <class T> - explicit TNode(const TNodeOps<T>& other) : Node_(other.Node_) {} - - TNodeRef Ref() { return TNodeRef(*this); } - -private: - std::shared_ptr<fy_node> Node_; - - TNode& operator=(fy_node* node); - - fy_node* NodeRawPointer() const { - return Node_.get(); - } -}; - -class TNodePairRef { -friend class TMappingIterator; -friend class TReverseMappingIterator; -friend class TMapping; - -public: - TNodePairRef(fy_node_pair* pair = nullptr) : Pair_(pair) {} - - bool operator==(const TNodePairRef& other) const { return Pair_ == other.Pair_; } - - explicit operator bool() const { return Pair_ != nullptr; } - - TNodeRef Key() const; - - int Index(const TNodeRef& node) const; - - void SetKey(const TNodeRef& node); - - TNodeRef Value() const; - - void SetValue(const TNodeRef& node); - -private: - fy_node_pair* Pair_ = nullptr; -}; - -class TMappingIterator { - friend class TMapping; -public: - explicit TMappingIterator(const TNodeRef& node, bool end = false); - - TMappingIterator(const TMappingIterator& other) { - Node_ = other.Node_; - NodePair_ = other.NodePair_; - } - - TMappingIterator& operator=(const TMappingIterator& other) { - Node_ = other.Node_; - NodePair_ = other.NodePair_; - return *this; - } - - TMappingIterator& operator++(); - - const TNodePairRef* operator->() const { return &NodePair_; } - - TMappingIterator operator++(int) { - TMappingIterator retval = *this; - ++(*this); - return retval; - } - - bool operator==(TMappingIterator other) const { return Node_ == other.Node_ && NodePair_ == other.NodePair_; } - - const TNodePairRef& operator*() const { return NodePair_; } - -private: - TNodeRef Node_; - TNodePairRef NodePair_; -}; - -class TReverseMappingIterator { - friend class TMapping; -public: - explicit TReverseMappingIterator(const TNodeRef& node, bool end = false); - - TReverseMappingIterator(const TReverseMappingIterator& other) { - Node_ = other.Node_; - NodePair_ = other.NodePair_; - } - - TReverseMappingIterator& operator=(const TReverseMappingIterator& other) { - Node_ = other.Node_; - NodePair_ = other.NodePair_; - return *this; - } - - TReverseMappingIterator& operator++(); - - const TNodePairRef* operator->() const { return &NodePair_; } - - TReverseMappingIterator operator++(int) { - TReverseMappingIterator retval = *this; - ++(*this); - return retval; - } - - bool operator==(TReverseMappingIterator other) const { return Node_ == other.Node_ && NodePair_ == other.NodePair_; } - - bool operator!=(TReverseMappingIterator other) const { return !(*this == other); } - - const TNodePairRef& operator*() const { return NodePair_; } - -private: - TNodeRef Node_; - TNodePairRef NodePair_; -}; - -class TMapping : public TNodeRef { -public: - template <class T> - explicit TMapping(const TNodeOps<T>& node) - : TNodeRef(node) - { - Y_DEBUG_ABORT_UNLESS(Type() == ENodeType::Mapping); - } - - TMappingIterator begin() const { - return TMappingIterator(*this); - } - - TMappingIterator end() const { - return TMappingIterator(*this, true); - } - - TReverseMappingIterator rbegin() const { - return TReverseMappingIterator(*this); - } - - TReverseMappingIterator rend() const { - return TReverseMappingIterator(*this, true); - } - - size_t size() const; - - size_t empty() const; - - TNodePairRef at(int index) const; - - TNodePairRef operator[](int index) const; - - TNodeRef at(const TString& index) const; - - TNodePairRef pair_at(const TString& index) const; - - TNodePairRef pair_at_opt(const TString& index) const; - - TNodeRef operator[](const TString& index) const; - - TNodeRef operator[](const char* str) const; - - void Append(const TNodeRef& key, const TNodeRef& value); - - void Prepend(const TNodeRef& key, const TNodeRef& value); - - void Remove(const TNodePairRef& toRemove); - - bool Has(TString key) const; - - TMappingIterator Remove(const TMappingIterator& toRemove); - - void Remove(const TNodeRef& key); -}; - -class TSequenceIterator { - friend class TSequence; -public: - explicit TSequenceIterator(const TNodeRef& node, bool end = false); - - TSequenceIterator(const TSequenceIterator& other) { - Node_ = other.Node_; - IterNode_ = other.IterNode_; - Iter_ = other.Iter_; - } - - TSequenceIterator& operator=(const TSequenceIterator& other) { - Node_ = other.Node_; - IterNode_ = other.IterNode_; - Iter_ = other.Iter_; - return *this; - } - - TSequenceIterator& operator++(); - - const TNodeRef* operator->() const { - return &IterNode_; - } - - TSequenceIterator operator++(int) { - TSequenceIterator retval = *this; - ++(*this); - return retval; - } - - bool operator==(TSequenceIterator other) const { return Node_ == other.Node_ && Iter_ == other.Iter_; } - - bool operator!=(TSequenceIterator other) const { return !(*this == other); } - - const TNodeRef& operator*() const { return IterNode_; } - - void InsertBefore(const TNodeRef& node); - - void InsertAfter(const TNodeRef& node); - -private: - TNodeRef Node_; - TNodeRef IterNode_; - void* Iter_ = nullptr; -}; - -class TReverseSequenceIterator { - friend class TSequence; -public: - explicit TReverseSequenceIterator(const TNodeRef& node, bool end = false); - - TReverseSequenceIterator(const TReverseSequenceIterator& other) { - Node_ = other.Node_; - IterNode_ = other.IterNode_; - Iter_ = other.Iter_; - } - - TReverseSequenceIterator& operator=(const TReverseSequenceIterator& other) { - Node_ = other.Node_; - IterNode_ = other.IterNode_; - Iter_ = other.Iter_; - return *this; - } - - TReverseSequenceIterator& operator++(); - - const TNodeRef* operator->() const { - return &IterNode_; - } - - TReverseSequenceIterator operator++(int) { - TReverseSequenceIterator retval = *this; - ++(*this); - return retval; - } - - bool operator==(TReverseSequenceIterator other) const { return Node_ == other.Node_ && Iter_ == other.Iter_; } - - bool operator!=(TReverseSequenceIterator other) const { return !(*this == other); } - - const TNodeRef& operator*() const { return IterNode_; } - - void InsertBefore(const TNodeRef& node); - - void InsertAfter(const TNodeRef& node); - -private: - TNodeRef Node_; - TNodeRef IterNode_; - void* Iter_ = nullptr; -}; - -class TSequence : public TNodeRef { -public: - explicit TSequence(const TNodeRef& node) - : TNodeRef(node) - { - Y_DEBUG_ABORT_UNLESS(Type() == ENodeType::Sequence); - } - - TSequenceIterator begin() const { - return TSequenceIterator(*this); - } - - TSequenceIterator end() const { - return TSequenceIterator(*this, true); - } - - TReverseSequenceIterator rbegin() const { - return TReverseSequenceIterator(*this); - } - - TReverseSequenceIterator rend() const { - return TReverseSequenceIterator(*this, true); - } - - size_t size() const; - - size_t empty() const; - - TNodeRef at(int index) const; - - TNodeRef operator[](int index) const; - - void Append(const TNodeRef& node); - - void Prepend(const TNodeRef& node); - - void InsertBefore(const TNodeRef& mark, const TNodeRef& node); - - void InsertAfter(const TNodeRef& mark, const TNodeRef& node); - - TNode Remove(const TNodeRef& toRemove); - - TSequenceIterator Remove(const TSequenceIterator& toRemove); - - TReverseSequenceIterator Remove(const TReverseSequenceIterator& toRemove); -}; - -class TDocumentNodeIterator - : public TDocumentIterator -{ -public: - explicit TDocumentNodeIterator(TNodeRef&& node); - - TDocumentNodeIterator(const TDocumentNodeIterator& other) - : TDocumentIterator(other.Iterator_.get()) - , Node_(other.Node_) - {} - - TDocumentNodeIterator& operator=(const TDocumentNodeIterator& other) { - Iterator_.reset(other.Iterator_.get()); - Node_ = other.Node_; - return *this; - } - - TDocumentNodeIterator& operator++(); - - TNodeRef* operator->() { - return &Node_; - } - - TDocumentNodeIterator operator++(int) { - TDocumentNodeIterator retval = *this; - ++(*this); - return retval; - } - - bool operator==(TDocumentNodeIterator other) const { return Node_ == other.Node_; } - - bool operator!=(TDocumentNodeIterator other) const { return !(*this == other); } - - TNodeRef& operator*() { return Node_; } - -private: - TNodeRef Node_; -}; - -class TDocument { - friend class NDetail::TNodeOps<TNodeRef>; - friend class NDetail::TNodeOps<TNode>; - friend class TParser; - - explicit TDocument(TString str, fy_document* doc = nullptr, fy_diag* diag = nullptr); - explicit TDocument(fy_document* doc = nullptr, fy_diag* diag = nullptr); - -public: - TDocument(TDocument&& other) - : Document_(std::move(other.Document_)) - , Diag_(std::move(other.Diag_)) - {} - - static TDocument Parse(TString cstr); - - TDocument Clone() const; - - template <class... Args> - size_t Scanf(const char* fmt, Args&& ...args) { - Y_DEBUG_ABORT_UNLESS(Document_); - return fy_document_scanf(Document_.get(), fmt, std::forward<Args>(args)...); - } - - void InsertAt(const char* path, const TNodeRef& node); - - template <class... Args> - TNodeRef Buildf(const char* fmt, Args&& ...args) { - Y_DEBUG_ABORT_UNLESS(Document_); - return fy_node_buildf(Document_.get(), fmt, std::forward<Args>(args)...); - } - - TNodeRef Buildf(const char* content); - - void Resolve(); - - bool HasDirectives(); - - bool HasExplicitDocumentStart(); - - bool HasExplicitDocumentEnd(); - - void SetParent(const TDocument& doc); - - TNodeRef Root(); - - void SetRoot(const TNodeRef& node); - - TDocumentNodeIterator begin() { - auto it = TDocumentNodeIterator(Root()); - ++it; - return it; - } - - TDocumentNodeIterator end() { - return TDocumentNodeIterator(TNodeRef(nullptr)); - } - - TNodeRef CreateAlias(const TString& name); - - std::unique_ptr<char, void(*)(char*)> EmitToCharArray() const; - - TMark BeginMark() const; - - TMark EndMark() const; - -private: - std::unique_ptr<fy_document, void(*)(fy_document*)> Document_; - std::unique_ptr<fy_diag, void(*)(fy_diag*)> Diag_; - - static void DestroyUserData(fy_node *fyn, void *meta, void *user) { - Y_UNUSED(fyn); - Y_UNUSED(user); - if (meta) { - auto* data = reinterpret_cast<NDetail::IBasicUserData*>(meta); - delete data; - } - } - - static void DestroyDocumentStrings(fy_document *fyd, void *user) { - Y_UNUSED(fyd); - if (user) { - auto* data = reinterpret_cast<THashSet<TSimpleSharedPtr<TString>, TStringPtrHashT>*>(user); - delete data; - } - } - - bool RegisterUserDataCleanup(); - void UnregisterUserDataCleanup(); -}; - -class TJsonEmitter { -public: - explicit TJsonEmitter(TDocument& doc) : Node_(doc.Root()) {} - explicit TJsonEmitter(const TNodeRef& node) : Node_(node) {} - - std::unique_ptr<char, void(*)(char*)> EmitToCharArray() const; - -private: - const TNodeRef Node_; -}; - -class TParser { - TParser(TString rawStream, fy_parser* doc, fy_diag* diag); -public: - static TParser Create(TString str); - - std::optional<TDocument> NextDocument(); -private: - TString RawDocumentStream_; - std::unique_ptr<fy_parser, void(*)(fy_parser*)> Parser_; - std::unique_ptr<fy_diag, void(*)(fy_diag*)> Diag_; -}; - -struct TMark { - size_t InputPos; - int Line; - int Column; -}; - -namespace NDetail { - -template <class T> -TNode TNodeOps<T>::CreateReference() const { - return TNode(TNodeOpsBase::CreateReference(Node())); -} - -template <class T> -TNode TNodeOps<T>::Copy() const { - return TNode(TNodeOpsBase::Copy(Node())); -} - -template <class T> -TNode TNodeOps<T>::Copy(TDocument& to) const { - return TNode(TNodeOpsBase::Copy(Node(), to.Document_.get())); -} - -template <class T> -TString TNodeOps<T>::Path() const { - return TNodeOpsBase::Path(Node()); -} - -template <class T> -ENodeType TNodeOps<T>::Type() const { - return TNodeOpsBase::Type(Node()); -} - -template <class T> -bool TNodeOps<T>::IsAlias() const { - return TNodeOpsBase::IsAlias(Node()); -} - -template <class T> -TNodeRef TNodeOps<T>::ResolveAlias() const { - return TNodeRef(TNodeOpsBase::ResolveAlias(Node())); -} - -template <class T> -TString TNodeOps<T>::Scalar() const { - return TNodeOpsBase::Scalar(Node()); -} - -template <class T> -TMark TNodeOps<T>::BeginMark() const { - return TNodeOpsBase::BeginMark(Node()); -} - -template <class T> -TMark TNodeOps<T>::EndMark() const { - return TNodeOpsBase::EndMark(Node()); -} - -template <class T> -TMapping TNodeOps<T>::Map() const { - return TMapping(TNodeRef(TNodeOpsBase::Map(Node()))); -} - -template <class T> -TSequence TNodeOps<T>::Sequence() const { - return TSequence(TNodeRef(TNodeOpsBase::Sequence(Node()))); -} - -template <class T> -void TNodeOps<T>::Insert(const TNodeRef& node) { - return TNodeOpsBase::Insert(Node(), node.Node_); -} - -template <class T> -std::optional<TString> TNodeOps<T>::Tag() const { - return TNodeOpsBase::Tag(Node()); -} - -template <class T> -void TNodeOps<T>::SetTag(const TString& tag) { - return TNodeOpsBase::SetTag(Node(), tag); -} - -template <class T> -bool TNodeOps<T>::RemoveTag() { - return TNodeOpsBase::RemoveTag(Node()); -} - -template <class T> -bool TNodeOps<T>::HasAnchor() const { - return TNodeOpsBase::HasAnchor(Node()); -} - -template <class T> -void TNodeOps<T>::SetAnchor(const TString& anchor) { - return TNodeOpsBase::SetAnchor(Node(), anchor); -} - -template <class T> -bool TNodeOps<T>::DeepEqual(const TNodeRef& other) { - return TNodeOpsBase::DeepEqual(Node(), other.Node_); -} - -template <class T> -std::unique_ptr<char, void(*)(char*)> TNodeOps<T>::EmitToCharArray() const { - return TNodeOpsBase::EmitToCharArray(Node()); -} - -template <class T> -void TNodeOps<T>::SetStyle(ENodeStyle style) { - return TNodeOpsBase::SetStyle(Node(), style); -} - -template <class T> -ENodeStyle TNodeOps<T>::Style() const { - return TNodeOpsBase::Style(Node()); -} - -template <class T> -const T& TNodeOps<T>::AsDerived() const { - return static_cast<const T&>(*this); -} - -template <class T> -fy_node* TNodeOps<T>::Node() const { - return AsDerived().NodeRawPointer(); -} - -template <class T> -fy_node* TNodeOps<T>::Node() { - return AsDerived().NodeRawPointer(); -} - -template <class T> -void TNodeOps<T>::SetUserData(IBasicUserData* data) { - return TNodeOpsBase::SetUserData(Node(), data); -} - -template <class T> -IBasicUserData* TNodeOps<T>::UserData() const { - return TNodeOpsBase::UserData(Node()); -} - -template <class T> -void TNodeOps<T>::ClearUserData() { - return TNodeOpsBase::ClearUserData(Node()); -} - -} // namespace NDetail - -} // namesapce NFyaml diff --git a/library/cpp/yaml/fyamlcpp/ya.make b/library/cpp/yaml/fyamlcpp/ya.make deleted file mode 100644 index 06ce8066ee..0000000000 --- a/library/cpp/yaml/fyamlcpp/ya.make +++ /dev/null @@ -1,16 +0,0 @@ -LIBRARY() - -SRCS( - fyamlcpp.cpp - fyamlcpp.h -) - -PEERDIR( - contrib/libs/libfyaml -) - -END() - -RECURSE_FOR_TESTS( - ut -) diff --git a/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp b/ydb/library/fyamlcpp/fyamlcpp_ut.cpp index 493aaab136..493aaab136 100644 --- a/library/cpp/yaml/fyamlcpp/fyamlcpp_ut.cpp +++ b/ydb/library/fyamlcpp/fyamlcpp_ut.cpp diff --git a/library/cpp/yaml/fyamlcpp/libfyaml_ut.cpp b/ydb/library/fyamlcpp/libfyaml_ut.cpp index d5e28cf98e..d5e28cf98e 100644 --- a/library/cpp/yaml/fyamlcpp/libfyaml_ut.cpp +++ b/ydb/library/fyamlcpp/libfyaml_ut.cpp diff --git a/ydb/library/fyamlcpp/ut/ya.make b/ydb/library/fyamlcpp/ut/ya.make index 1ac2b25438..82683deb73 100644 --- a/ydb/library/fyamlcpp/ut/ya.make +++ b/ydb/library/fyamlcpp/ut/ya.make @@ -1,4 +1,4 @@ -UNITTEST_FOR(library/cpp/yaml/fyamlcpp) +UNITTEST_FOR(ydb/library/fyamlcpp) SRCS( fyamlcpp_ut.cpp |