fyamlcpp.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939
  1. #pragma once
  2. #include <util/generic/yexception.h>
  3. #include <util/system/compiler.h>
  4. #include <util/system/yassert.h>
  5. #include <util/stream/str.h>
  6. #include <util/generic/hash_set.h>
  7. #include <util/generic/vector.h>
  8. #include <memory>
  9. #include <optional>
  10. #define ENSURE_NODE_NOT_EMPTY(NODE) Y_ENSURE_EX(NODE, TFyamlEx() << "Expected non-empty Node")
  11. #define ENSURE_DOCUMENT_NOT_EMPTY(NODE) Y_ENSURE_EX(NODE, TFyamlEx() << "Expected non-empty Document")
  12. struct fy_parser;
  13. struct fy_node;
  14. struct fy_document;
  15. struct fy_diag;
  16. struct fy_document_iterator;
  17. struct fy_node_pair;
  18. extern "C" struct fy_node *fy_node_buildf(struct fy_document *fyd, const char *fmt, ...);
  19. namespace NFyaml {
  20. namespace NDetail {
  21. template <class T>
  22. class TNodeOps;
  23. }
  24. class TNodeRef;
  25. class TNode;
  26. }
  27. bool operator==(const fy_node* node1, const NFyaml::NDetail::TNodeOps<NFyaml::TNodeRef>& node2);
  28. bool operator==(const fy_node* node1, const NFyaml::NDetail::TNodeOps<NFyaml::TNode>& node2);
  29. namespace NFyaml {
  30. struct TStringPtrHashT {
  31. size_t operator()(const TSimpleSharedPtr<TString>& str) const {
  32. return (size_t)str.Get();
  33. }
  34. };
  35. // do TFyaml(str) instead of TFyaml() << str;
  36. class TFyamlEx : public yexception {
  37. public:
  38. TFyamlEx() {}
  39. TFyamlEx(TString error) : Errors_({error}) {}
  40. TFyamlEx(std::initializer_list<TString> errors) : Errors_(errors) {}
  41. const TVector<TString>& Errors() {
  42. return Errors_;
  43. }
  44. const char* what() const noexcept override {
  45. What_ = TString(yexception::what());
  46. for (auto& err : Errors_) {
  47. What_.push_back('\n');
  48. What_.append(err);
  49. }
  50. return What_.c_str();
  51. }
  52. TFyamlEx& AddError(TString error) {
  53. Errors_.push_back(error);
  54. return *this;
  55. }
  56. TStringBuf AsStrBuf() const {
  57. return what();
  58. }
  59. private:
  60. TVector<TString> Errors_;
  61. mutable TString What_;
  62. };
  63. enum class ENodeType {
  64. Scalar,
  65. Sequence,
  66. Mapping,
  67. };
  68. enum class ENodeStyle {
  69. Any = -1,
  70. Flow,
  71. Block,
  72. Plain,
  73. SingleQuoted,
  74. DoubleQuoted,
  75. Literal,
  76. Folded,
  77. Alias,
  78. };
  79. class TNodeRef;
  80. class TDocumentIterator;
  81. class TDocument;
  82. class TNode;
  83. class TMappingIterator;
  84. class TReverseMappingIterator;
  85. class TMapping;
  86. class TSequenceIterator;
  87. class TReverseSequenceIterator;
  88. class TSequence;
  89. class TJsonEmitter;
  90. class TParser;
  91. struct TMark;
  92. namespace NDetail {
  93. class IBasicUserData {
  94. public:
  95. virtual ~IBasicUserData() = default;
  96. };
  97. template <class T>
  98. class TUserDataHolder : public IBasicUserData {
  99. public:
  100. TUserDataHolder(IBasicUserData* next, T* data)
  101. : Next_(next)
  102. , Data_(data)
  103. {}
  104. private:
  105. std::unique_ptr<IBasicUserData> Next_ = nullptr;
  106. std::unique_ptr<T> Data_ = nullptr;
  107. };
  108. void ThrowAllExceptionsIfAny(fy_diag* diag);
  109. void RethrowError(fy_diag* diag);
  110. void RethrowOnError(bool isError, fy_node* node);
  111. void RethrowOnError(bool isError, fy_node_pair* pair);
  112. void RethrowOnError(bool isError, fy_diag* diag);
  113. void FreeChar(char* mem);
  114. bool IsComplexType(ENodeType type);
  115. class TNodeOpsBase {
  116. protected:
  117. TString Path(fy_node* node) const;
  118. ENodeType Type(fy_node* node) const;
  119. fy_node* Copy(fy_node* node) const;
  120. fy_node* Copy(fy_node* node, fy_document* to) const;
  121. bool IsAlias(fy_node* node) const;
  122. fy_node* ResolveAlias(fy_node* node) const;
  123. fy_node* CreateReference(fy_node* node) const;
  124. fy_node* Sequence(fy_node* node) const;
  125. fy_node* Map(fy_node* node) const;
  126. TString Scalar(fy_node* node) const;
  127. TMark BeginMark(fy_node* node) const;
  128. TMark EndMark(fy_node* node) const;
  129. void Insert(fy_node* thisNode, fy_node* node);
  130. std::optional<TString> Tag(fy_node* node) const;
  131. void SetTag(fy_node* node, const TString& tag);
  132. bool RemoveTag(fy_node* node);
  133. bool HasAnchor(fy_node* node) const;
  134. void SetAnchor(fy_node* node, const TString& anchor);
  135. bool DeepEqual(fy_node* thisNode, fy_node* other);
  136. std::unique_ptr<char, void(*)(char*)> EmitToCharArray(fy_node* node) const;
  137. void SetStyle(fy_node* node, ENodeStyle style);
  138. ENodeStyle Style(fy_node* node) const;
  139. protected:
  140. void SetUserData(fy_node* node, NDetail::IBasicUserData* data);
  141. NDetail::IBasicUserData* UserData(fy_node* node) const;
  142. void ClearUserData(fy_node* node);
  143. };
  144. template <class T>
  145. class TNodeOps : public TNodeOpsBase {
  146. friend class ::NFyaml::TNodeRef;
  147. public:
  148. template <class OtherT>
  149. bool operator==(const TNodeOps<OtherT>& other) const { return Node() == other.Node(); }
  150. bool operator==(const fy_node* node) const { return Node() == node; }
  151. friend bool ::operator==(const fy_node* node1, const TNodeOps<NFyaml::TNodeRef>& node2);
  152. friend bool ::operator==(const fy_node* node1, const TNodeOps<NFyaml::TNode>& node2);
  153. explicit operator bool() const { return Node() != nullptr; }
  154. TString Path() const;
  155. ENodeType Type() const;
  156. TNode Copy() const;
  157. TNode Copy(TDocument& to) const;
  158. bool IsAlias() const;
  159. TNodeRef ResolveAlias() const;
  160. TNode CreateReference() const;
  161. TSequence Sequence() const;
  162. TMapping Map() const;
  163. TString Scalar() const;
  164. TMark BeginMark() const;
  165. TMark EndMark() const;
  166. void Insert(const TNodeRef& node);
  167. bool Empty() const { return Node() == nullptr; }
  168. std::optional<TString> Tag() const;
  169. void SetTag(const TString& tag);
  170. bool RemoveTag();
  171. bool HasAnchor() const;
  172. void SetAnchor(const TString& anchor);
  173. bool DeepEqual(const TNodeRef& other);
  174. std::unique_ptr<char, void(*)(char*)> EmitToCharArray() const;
  175. void SetStyle(ENodeStyle style);
  176. ENodeStyle Style() const;
  177. protected:
  178. const T& AsDerived() const;
  179. fy_node* Node() const;
  180. fy_node* Node();
  181. void SetUserData(NDetail::IBasicUserData* data);
  182. NDetail::IBasicUserData* UserData() const;
  183. void ClearUserData();
  184. };
  185. } // namespace NDetail
  186. class TDocumentIterator {
  187. friend class TDocument;
  188. public:
  189. explicit TDocumentIterator(fy_document_iterator* iterator = nullptr);
  190. protected:
  191. std::unique_ptr<fy_document_iterator, void(*)(fy_document_iterator*)> Iterator_;
  192. };
  193. class TNodeRef : public NDetail::TNodeOps<TNodeRef> {
  194. friend class TNodeOps<TNodeRef>;
  195. friend class TNodeOpsBase;
  196. friend class TDocument;
  197. friend class TDocumentNodeIterator;
  198. friend class TMapping;
  199. friend class TMappingIterator;
  200. friend class TReverseMappingIterator;
  201. friend class TNodePairRef;
  202. friend class TSequence;
  203. friend class TSequenceIterator;
  204. friend class TReverseSequenceIterator;
  205. friend class TJsonEmitter;
  206. public:
  207. TNodeRef() = default;
  208. template <class T>
  209. TNodeRef(const TNodeOps<T>& other) : Node_(other.Node()) {}
  210. explicit TNodeRef(const TNodeRef& other) : Node_(other.Node_) {}
  211. TNodeRef(fy_node* node);
  212. TNodeRef& operator=(const TNodeRef& other) { Node_ = other.Node_; return *this; }
  213. TNodeRef& operator=(fy_node* node) { Node_ = node; return *this; }
  214. protected:
  215. fy_node* Node_ = nullptr;
  216. private:
  217. fy_node* NodeRawPointer() const;
  218. };
  219. class TNode : public NDetail::TNodeOps<TNode> {
  220. friend class TNodeOps<TNode>;
  221. public:
  222. TNode(fy_node* node = nullptr);
  223. template <class T>
  224. explicit TNode(const TNodeOps<T>& other) : Node_(other.Node_) {}
  225. TNodeRef Ref() { return TNodeRef(*this); }
  226. private:
  227. std::shared_ptr<fy_node> Node_;
  228. TNode& operator=(fy_node* node);
  229. fy_node* NodeRawPointer() const {
  230. return Node_.get();
  231. }
  232. };
  233. class TNodePairRef {
  234. friend class TMappingIterator;
  235. friend class TReverseMappingIterator;
  236. friend class TMapping;
  237. public:
  238. TNodePairRef(fy_node_pair* pair = nullptr) : Pair_(pair) {}
  239. bool operator==(const TNodePairRef& other) const { return Pair_ == other.Pair_; }
  240. explicit operator bool() const { return Pair_ != nullptr; }
  241. TNodeRef Key() const;
  242. int Index(const TNodeRef& node) const;
  243. void SetKey(const TNodeRef& node);
  244. TNodeRef Value() const;
  245. void SetValue(const TNodeRef& node);
  246. private:
  247. fy_node_pair* Pair_ = nullptr;
  248. };
  249. class TMappingIterator {
  250. friend class TMapping;
  251. public:
  252. explicit TMappingIterator(const TNodeRef& node, bool end = false);
  253. TMappingIterator(const TMappingIterator& other) {
  254. Node_ = other.Node_;
  255. NodePair_ = other.NodePair_;
  256. }
  257. TMappingIterator& operator=(const TMappingIterator& other) {
  258. Node_ = other.Node_;
  259. NodePair_ = other.NodePair_;
  260. return *this;
  261. }
  262. TMappingIterator& operator++();
  263. const TNodePairRef* operator->() const { return &NodePair_; }
  264. TMappingIterator operator++(int) {
  265. TMappingIterator retval = *this;
  266. ++(*this);
  267. return retval;
  268. }
  269. bool operator==(TMappingIterator other) const { return Node_ == other.Node_ && NodePair_ == other.NodePair_; }
  270. const TNodePairRef& operator*() const { return NodePair_; }
  271. private:
  272. TNodeRef Node_;
  273. TNodePairRef NodePair_;
  274. };
  275. class TReverseMappingIterator {
  276. friend class TMapping;
  277. public:
  278. explicit TReverseMappingIterator(const TNodeRef& node, bool end = false);
  279. TReverseMappingIterator(const TReverseMappingIterator& other) {
  280. Node_ = other.Node_;
  281. NodePair_ = other.NodePair_;
  282. }
  283. TReverseMappingIterator& operator=(const TReverseMappingIterator& other) {
  284. Node_ = other.Node_;
  285. NodePair_ = other.NodePair_;
  286. return *this;
  287. }
  288. TReverseMappingIterator& operator++();
  289. const TNodePairRef* operator->() const { return &NodePair_; }
  290. TReverseMappingIterator operator++(int) {
  291. TReverseMappingIterator retval = *this;
  292. ++(*this);
  293. return retval;
  294. }
  295. bool operator==(TReverseMappingIterator other) const { return Node_ == other.Node_ && NodePair_ == other.NodePair_; }
  296. bool operator!=(TReverseMappingIterator other) const { return !(*this == other); }
  297. const TNodePairRef& operator*() const { return NodePair_; }
  298. private:
  299. TNodeRef Node_;
  300. TNodePairRef NodePair_;
  301. };
  302. class TMapping : public TNodeRef {
  303. public:
  304. template <class T>
  305. explicit TMapping(const TNodeOps<T>& node)
  306. : TNodeRef(node)
  307. {
  308. Y_VERIFY_DEBUG(Type() == ENodeType::Mapping);
  309. }
  310. TMappingIterator begin() const {
  311. return TMappingIterator(*this);
  312. }
  313. TMappingIterator end() const {
  314. return TMappingIterator(*this, true);
  315. }
  316. TReverseMappingIterator rbegin() const {
  317. return TReverseMappingIterator(*this);
  318. }
  319. TReverseMappingIterator rend() const {
  320. return TReverseMappingIterator(*this, true);
  321. }
  322. size_t size() const;
  323. size_t empty() const;
  324. TNodePairRef at(int index) const;
  325. TNodePairRef operator[](int index) const;
  326. TNodeRef at(const TString& index) const;
  327. TNodePairRef pair_at(const TString& index) const;
  328. TNodePairRef pair_at_opt(const TString& index) const;
  329. TNodeRef operator[](const TString& index) const;
  330. TNodeRef operator[](const char* str) const;
  331. void Append(const TNodeRef& key, const TNodeRef& value);
  332. void Prepend(const TNodeRef& key, const TNodeRef& value);
  333. void Remove(const TNodePairRef& toRemove);
  334. bool Has(TString key) const;
  335. TMappingIterator Remove(const TMappingIterator& toRemove);
  336. void Remove(const TNodeRef& key);
  337. };
  338. class TSequenceIterator {
  339. friend class TSequence;
  340. public:
  341. explicit TSequenceIterator(const TNodeRef& node, bool end = false);
  342. TSequenceIterator(const TSequenceIterator& other) {
  343. Node_ = other.Node_;
  344. IterNode_ = other.IterNode_;
  345. Iter_ = other.Iter_;
  346. }
  347. TSequenceIterator& operator=(const TSequenceIterator& other) {
  348. Node_ = other.Node_;
  349. IterNode_ = other.IterNode_;
  350. Iter_ = other.Iter_;
  351. return *this;
  352. }
  353. TSequenceIterator& operator++();
  354. const TNodeRef* operator->() const {
  355. return &IterNode_;
  356. }
  357. TSequenceIterator operator++(int) {
  358. TSequenceIterator retval = *this;
  359. ++(*this);
  360. return retval;
  361. }
  362. bool operator==(TSequenceIterator other) const { return Node_ == other.Node_ && Iter_ == other.Iter_; }
  363. bool operator!=(TSequenceIterator other) const { return !(*this == other); }
  364. const TNodeRef& operator*() const { return IterNode_; }
  365. void InsertBefore(const TNodeRef& node);
  366. void InsertAfter(const TNodeRef& node);
  367. private:
  368. TNodeRef Node_;
  369. TNodeRef IterNode_;
  370. void* Iter_ = nullptr;
  371. };
  372. class TReverseSequenceIterator {
  373. friend class TSequence;
  374. public:
  375. explicit TReverseSequenceIterator(const TNodeRef& node, bool end = false);
  376. TReverseSequenceIterator(const TReverseSequenceIterator& other) {
  377. Node_ = other.Node_;
  378. IterNode_ = other.IterNode_;
  379. Iter_ = other.Iter_;
  380. }
  381. TReverseSequenceIterator& operator=(const TReverseSequenceIterator& other) {
  382. Node_ = other.Node_;
  383. IterNode_ = other.IterNode_;
  384. Iter_ = other.Iter_;
  385. return *this;
  386. }
  387. TReverseSequenceIterator& operator++();
  388. const TNodeRef* operator->() const {
  389. return &IterNode_;
  390. }
  391. TReverseSequenceIterator operator++(int) {
  392. TReverseSequenceIterator retval = *this;
  393. ++(*this);
  394. return retval;
  395. }
  396. bool operator==(TReverseSequenceIterator other) const { return Node_ == other.Node_ && Iter_ == other.Iter_; }
  397. bool operator!=(TReverseSequenceIterator other) const { return !(*this == other); }
  398. const TNodeRef& operator*() const { return IterNode_; }
  399. void InsertBefore(const TNodeRef& node);
  400. void InsertAfter(const TNodeRef& node);
  401. private:
  402. TNodeRef Node_;
  403. TNodeRef IterNode_;
  404. void* Iter_ = nullptr;
  405. };
  406. class TSequence : public TNodeRef {
  407. public:
  408. explicit TSequence(const TNodeRef& node)
  409. : TNodeRef(node)
  410. {
  411. Y_VERIFY_DEBUG(Type() == ENodeType::Sequence);
  412. }
  413. TSequenceIterator begin() const {
  414. return TSequenceIterator(*this);
  415. }
  416. TSequenceIterator end() const {
  417. return TSequenceIterator(*this, true);
  418. }
  419. TReverseSequenceIterator rbegin() const {
  420. return TReverseSequenceIterator(*this);
  421. }
  422. TReverseSequenceIterator rend() const {
  423. return TReverseSequenceIterator(*this, true);
  424. }
  425. size_t size() const;
  426. size_t empty() const;
  427. TNodeRef at(int index) const;
  428. TNodeRef operator[](int index) const;
  429. void Append(const TNodeRef& node);
  430. void Prepend(const TNodeRef& node);
  431. void InsertBefore(const TNodeRef& mark, const TNodeRef& node);
  432. void InsertAfter(const TNodeRef& mark, const TNodeRef& node);
  433. TNode Remove(const TNodeRef& toRemove);
  434. TSequenceIterator Remove(const TSequenceIterator& toRemove);
  435. TReverseSequenceIterator Remove(const TReverseSequenceIterator& toRemove);
  436. };
  437. class TDocumentNodeIterator
  438. : public TDocumentIterator
  439. {
  440. public:
  441. explicit TDocumentNodeIterator(TNodeRef&& node);
  442. TDocumentNodeIterator(const TDocumentNodeIterator& other)
  443. : TDocumentIterator(other.Iterator_.get())
  444. , Node_(other.Node_)
  445. {}
  446. TDocumentNodeIterator& operator=(const TDocumentNodeIterator& other) {
  447. Iterator_.reset(other.Iterator_.get());
  448. Node_ = other.Node_;
  449. return *this;
  450. }
  451. TDocumentNodeIterator& operator++();
  452. TNodeRef* operator->() {
  453. return &Node_;
  454. }
  455. TDocumentNodeIterator operator++(int) {
  456. TDocumentNodeIterator retval = *this;
  457. ++(*this);
  458. return retval;
  459. }
  460. bool operator==(TDocumentNodeIterator other) const { return Node_ == other.Node_; }
  461. bool operator!=(TDocumentNodeIterator other) const { return !(*this == other); }
  462. TNodeRef& operator*() { return Node_; }
  463. private:
  464. TNodeRef Node_;
  465. };
  466. class TDocument {
  467. friend class NDetail::TNodeOps<TNodeRef>;
  468. friend class NDetail::TNodeOps<TNode>;
  469. friend class TParser;
  470. explicit TDocument(TString str, fy_document* doc = nullptr, fy_diag* diag = nullptr);
  471. explicit TDocument(fy_document* doc = nullptr, fy_diag* diag = nullptr);
  472. public:
  473. TDocument(TDocument&& other)
  474. : Document_(std::move(other.Document_))
  475. , Diag_(std::move(other.Diag_))
  476. {}
  477. static TDocument Parse(TString cstr);
  478. TDocument Clone() const;
  479. template <class... Args>
  480. size_t Scanf(const char* fmt, Args&& ...args) {
  481. Y_VERIFY_DEBUG(Document_);
  482. return fy_document_scanf(Document_.get(), fmt, std::forward<Args>(args)...);
  483. }
  484. void InsertAt(const char* path, const TNodeRef& node);
  485. template <class... Args>
  486. TNodeRef Buildf(const char* fmt, Args&& ...args) {
  487. Y_VERIFY_DEBUG(Document_);
  488. return fy_node_buildf(Document_.get(), fmt, std::forward<Args>(args)...);
  489. }
  490. TNodeRef Buildf(const char* content);
  491. void Resolve();
  492. bool HasDirectives();
  493. bool HasExplicitDocumentStart();
  494. bool HasExplicitDocumentEnd();
  495. void SetParent(const TDocument& doc);
  496. TNodeRef Root();
  497. void SetRoot(const TNodeRef& node);
  498. TDocumentNodeIterator begin() {
  499. auto it = TDocumentNodeIterator(Root());
  500. ++it;
  501. return it;
  502. }
  503. TDocumentNodeIterator end() {
  504. return TDocumentNodeIterator(TNodeRef(nullptr));
  505. }
  506. TNodeRef CreateAlias(const TString& name);
  507. std::unique_ptr<char, void(*)(char*)> EmitToCharArray() const;
  508. TMark BeginMark() const;
  509. TMark EndMark() const;
  510. private:
  511. std::unique_ptr<fy_document, void(*)(fy_document*)> Document_;
  512. std::unique_ptr<fy_diag, void(*)(fy_diag*)> Diag_;
  513. static void DestroyUserData(fy_node *fyn, void *meta, void *user) {
  514. Y_UNUSED(fyn);
  515. Y_UNUSED(user);
  516. if (meta) {
  517. auto* data = reinterpret_cast<NDetail::IBasicUserData*>(meta);
  518. delete data;
  519. }
  520. }
  521. static void DestroyDocumentStrings(fy_document *fyd, void *user) {
  522. Y_UNUSED(fyd);
  523. if (user) {
  524. auto* data = reinterpret_cast<THashSet<TSimpleSharedPtr<TString>, TStringPtrHashT>*>(user);
  525. delete data;
  526. }
  527. }
  528. bool RegisterUserDataCleanup();
  529. void UnregisterUserDataCleanup();
  530. };
  531. class TJsonEmitter {
  532. public:
  533. explicit TJsonEmitter(TDocument& doc) : Node_(doc.Root()) {}
  534. explicit TJsonEmitter(const TNodeRef& node) : Node_(node) {}
  535. std::unique_ptr<char, void(*)(char*)> EmitToCharArray() const;
  536. private:
  537. const TNodeRef Node_;
  538. };
  539. class TParser {
  540. TParser(TString rawStream, fy_parser* doc, fy_diag* diag);
  541. public:
  542. static TParser Create(TString str);
  543. std::optional<TDocument> NextDocument();
  544. private:
  545. TString RawDocumentStream_;
  546. std::unique_ptr<fy_parser, void(*)(fy_parser*)> Parser_;
  547. std::unique_ptr<fy_diag, void(*)(fy_diag*)> Diag_;
  548. };
  549. struct TMark {
  550. size_t InputPos;
  551. int Line;
  552. int Column;
  553. };
  554. namespace NDetail {
  555. template <class T>
  556. TNode TNodeOps<T>::CreateReference() const {
  557. return TNode(TNodeOpsBase::CreateReference(Node()));
  558. }
  559. template <class T>
  560. TNode TNodeOps<T>::Copy() const {
  561. return TNode(TNodeOpsBase::Copy(Node()));
  562. }
  563. template <class T>
  564. TNode TNodeOps<T>::Copy(TDocument& to) const {
  565. return TNode(TNodeOpsBase::Copy(Node(), to.Document_.get()));
  566. }
  567. template <class T>
  568. TString TNodeOps<T>::Path() const {
  569. return TNodeOpsBase::Path(Node());
  570. }
  571. template <class T>
  572. ENodeType TNodeOps<T>::Type() const {
  573. return TNodeOpsBase::Type(Node());
  574. }
  575. template <class T>
  576. bool TNodeOps<T>::IsAlias() const {
  577. return TNodeOpsBase::IsAlias(Node());
  578. }
  579. template <class T>
  580. TNodeRef TNodeOps<T>::ResolveAlias() const {
  581. return TNodeRef(TNodeOpsBase::ResolveAlias(Node()));
  582. }
  583. template <class T>
  584. TString TNodeOps<T>::Scalar() const {
  585. return TNodeOpsBase::Scalar(Node());
  586. }
  587. template <class T>
  588. TMark TNodeOps<T>::BeginMark() const {
  589. return TNodeOpsBase::BeginMark(Node());
  590. }
  591. template <class T>
  592. TMark TNodeOps<T>::EndMark() const {
  593. return TNodeOpsBase::EndMark(Node());
  594. }
  595. template <class T>
  596. TMapping TNodeOps<T>::Map() const {
  597. return TMapping(TNodeRef(TNodeOpsBase::Map(Node())));
  598. }
  599. template <class T>
  600. TSequence TNodeOps<T>::Sequence() const {
  601. return TSequence(TNodeRef(TNodeOpsBase::Sequence(Node())));
  602. }
  603. template <class T>
  604. void TNodeOps<T>::Insert(const TNodeRef& node) {
  605. return TNodeOpsBase::Insert(Node(), node.Node_);
  606. }
  607. template <class T>
  608. std::optional<TString> TNodeOps<T>::Tag() const {
  609. return TNodeOpsBase::Tag(Node());
  610. }
  611. template <class T>
  612. void TNodeOps<T>::SetTag(const TString& tag) {
  613. return TNodeOpsBase::SetTag(Node(), tag);
  614. }
  615. template <class T>
  616. bool TNodeOps<T>::RemoveTag() {
  617. return TNodeOpsBase::RemoveTag(Node());
  618. }
  619. template <class T>
  620. bool TNodeOps<T>::HasAnchor() const {
  621. return TNodeOpsBase::HasAnchor(Node());
  622. }
  623. template <class T>
  624. void TNodeOps<T>::SetAnchor(const TString& anchor) {
  625. return TNodeOpsBase::SetAnchor(Node(), anchor);
  626. }
  627. template <class T>
  628. bool TNodeOps<T>::DeepEqual(const TNodeRef& other) {
  629. return TNodeOpsBase::DeepEqual(Node(), other.Node_);
  630. }
  631. template <class T>
  632. std::unique_ptr<char, void(*)(char*)> TNodeOps<T>::EmitToCharArray() const {
  633. return TNodeOpsBase::EmitToCharArray(Node());
  634. }
  635. template <class T>
  636. void TNodeOps<T>::SetStyle(ENodeStyle style) {
  637. return TNodeOpsBase::SetStyle(Node(), style);
  638. }
  639. template <class T>
  640. ENodeStyle TNodeOps<T>::Style() const {
  641. return TNodeOpsBase::Style(Node());
  642. }
  643. template <class T>
  644. const T& TNodeOps<T>::AsDerived() const {
  645. return static_cast<const T&>(*this);
  646. }
  647. template <class T>
  648. fy_node* TNodeOps<T>::Node() const {
  649. return AsDerived().NodeRawPointer();
  650. }
  651. template <class T>
  652. fy_node* TNodeOps<T>::Node() {
  653. return AsDerived().NodeRawPointer();
  654. }
  655. template <class T>
  656. void TNodeOps<T>::SetUserData(IBasicUserData* data) {
  657. return TNodeOpsBase::SetUserData(Node(), data);
  658. }
  659. template <class T>
  660. IBasicUserData* TNodeOps<T>::UserData() const {
  661. return TNodeOpsBase::UserData(Node());
  662. }
  663. template <class T>
  664. void TNodeOps<T>::ClearUserData() {
  665. return TNodeOpsBase::ClearUserData(Node());
  666. }
  667. } // namespace NDetail
  668. } // namesapce NFyaml