blob: 83727ff50416c93211e8d8cf3dfa76ff39a2c735 [file] [log] [blame]
Václav Kubernát24df80e2018-06-06 15:18:03 +02001/*
2 * Copyright (C) 2018 CESNET, https://photonics.cesnet.cz/
3 * Copyright (C) 2018 FIT CVUT, https://fit.cvut.cz/
4 *
5 * Written by Václav Kubernát <kubervac@fit.cvut.cz>
6 *
7*/
8#pragma once
9
Václav Kubernát24df80e2018-06-06 15:18:03 +020010#include <boost/fusion/adapted/struct/adapt_struct.hpp>
11#include <boost/fusion/include/adapt_struct.hpp>
12#include <boost/fusion/include/std_pair.hpp>
Václav Kubernát24df80e2018-06-06 15:18:03 +020013#include <map>
Václav Kubernátb5ca1542020-05-27 01:03:54 +020014#include <variant>
Václav Kubernát24df80e2018-06-06 15:18:03 +020015#include <vector>
16
Václav Kubernáteeb38842019-03-20 19:46:05 +010017#include "ast_values.hpp"
Václav Kubernáta93f9002020-05-28 03:09:42 +020018#include "list_instance.hpp"
Václav Kubernáteeb38842019-03-20 19:46:05 +010019
Václav Kubernátefcac932020-01-10 15:26:32 +010020enum class Prefixes {
21 Always,
22 WhenNeeded
23};
24
Václav Kubernát24df80e2018-06-06 15:18:03 +020025struct nodeup_ {
26 bool operator==(const nodeup_&) const
27 {
28 return true;
29 }
30};
31
32struct container_ {
33 container_() = default;
34 container_(const std::string& name);
35
36 bool operator==(const container_& b) const;
37
38 std::string m_name;
39};
40
41struct leaf_ {
42 leaf_() = default;
43 leaf_(const std::string& name);
44
45 bool operator==(const leaf_& b) const;
46
47 std::string m_name;
48};
49
Václav Kubernát5b8a8f32020-05-20 00:57:22 +020050struct leafList_ {
Václav Kubernát5b8a8f32020-05-20 00:57:22 +020051 leafList_(const std::string& name);
52
53 bool operator==(const leafList_& b) const;
54
55 std::string m_name;
56};
57
58struct leafListElement_ {
59 bool operator==(const leafListElement_& b) const;
60
61 std::string m_name;
62 leaf_data_ m_value;
63};
64
Václav Kubernát24df80e2018-06-06 15:18:03 +020065struct listElement_ {
66 listElement_() {}
Václav Kubernátc15fe822020-06-04 11:28:39 +020067 listElement_(const std::string& listName, const ListInstance& keys);
Václav Kubernát24df80e2018-06-06 15:18:03 +020068
69 bool operator==(const listElement_& b) const;
70
71 std::string m_name;
Václav Kubernáta93f9002020-05-28 03:09:42 +020072 ListInstance m_keys;
Václav Kubernát24df80e2018-06-06 15:18:03 +020073};
74
Václav Kubernát2eaceb82018-10-08 19:56:30 +020075struct list_ {
76 list_() {}
77 list_(const std::string& listName);
78
79 bool operator==(const list_& b) const;
80
81 std::string m_name;
82};
83
Václav Kubernát2eaceb82018-10-08 19:56:30 +020084struct schemaNode_ {
85 boost::optional<module_> m_prefix;
Václav Kubernátb5ca1542020-05-27 01:03:54 +020086 std::variant<container_, list_, nodeup_, leaf_, leafList_> m_suffix;
Václav Kubernát2eaceb82018-10-08 19:56:30 +020087
88 schemaNode_();
89 schemaNode_(decltype(m_suffix) node);
90 schemaNode_(module_ module, decltype(m_suffix) node);
91 bool operator==(const schemaNode_& b) const;
92};
93
94struct dataNode_ {
Václav Kubernát744f57f2018-06-29 22:46:26 +020095 boost::optional<module_> m_prefix;
Václav Kubernátb5ca1542020-05-27 01:03:54 +020096 std::variant<container_, listElement_, nodeup_, leaf_, leafListElement_, leafList_, list_> m_suffix;
Václav Kubernát24df80e2018-06-06 15:18:03 +020097
Václav Kubernát2eaceb82018-10-08 19:56:30 +020098 dataNode_();
99 dataNode_(decltype(m_suffix) node);
Václav Kubernát2db124c2020-05-28 21:58:36 +0200100 dataNode_(boost::optional<module_> module, decltype(m_suffix) node);
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200101 dataNode_(module_ module, decltype(m_suffix) node);
102 bool operator==(const dataNode_& b) const;
Václav Kubernát744f57f2018-06-29 22:46:26 +0200103};
104
Václav Kubernátd6fd2492018-11-19 15:11:16 +0100105enum class TrailingSlash {
106 Present,
107 NonPresent
108};
109
Václav Kubernátb6ff0b62018-08-30 16:14:53 +0200110enum class Scope {
Václav Kubernát37171a12018-08-31 17:01:48 +0200111 Absolute,
112 Relative
113};
114
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200115struct schemaPath_ {
Jan Kundrát97376f72020-06-15 19:26:31 +0200116 schemaPath_();
117 schemaPath_(const Scope scope, const std::vector<schemaNode_>& nodes, const TrailingSlash trailingSlash = TrailingSlash::NonPresent);
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200118 bool operator==(const schemaPath_& b) const;
Václav Kubernát37171a12018-08-31 17:01:48 +0200119 Scope m_scope = Scope::Relative;
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200120 std::vector<schemaNode_> m_nodes;
Václav Kubernátd6fd2492018-11-19 15:11:16 +0100121 TrailingSlash m_trailingSlash = TrailingSlash::NonPresent;
Václav Kubernáte781b902020-06-15 14:35:11 +0200122 // @brief Pushes a new fragment. Pops a fragment if it's nodeup_
123 void pushFragment(const schemaNode_& fragment);
Václav Kubernát744f57f2018-06-29 22:46:26 +0200124};
125
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200126struct dataPath_ {
Jan Kundrát97376f72020-06-15 19:26:31 +0200127 dataPath_();
128 dataPath_(const Scope scope, const std::vector<dataNode_>& nodes, const TrailingSlash trailingSlash = TrailingSlash::NonPresent);
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200129 bool operator==(const dataPath_& b) const;
130 Scope m_scope = Scope::Relative;
131 std::vector<dataNode_> m_nodes;
Václav Kubernátd6fd2492018-11-19 15:11:16 +0100132 TrailingSlash m_trailingSlash = TrailingSlash::NonPresent;
Václav Kubernáte781b902020-06-15 14:35:11 +0200133
134 // @brief Pushes a new fragment. Pops a fragment if it's nodeup_
135 void pushFragment(const dataNode_& fragment);
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200136};
Václav Kubernát744f57f2018-06-29 22:46:26 +0200137
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200138std::string nodeToSchemaString(decltype(dataPath_::m_nodes)::value_type node);
139
Václav Kubernátefcac932020-01-10 15:26:32 +0100140std::string pathToDataString(const dataPath_& path, Prefixes prefixes);
141std::string pathToSchemaString(const schemaPath_& path, Prefixes prefixes);
142std::string pathToSchemaString(const dataPath_& path, Prefixes prefixes);
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200143schemaNode_ dataNodeToSchemaNode(const dataNode_& node);
144schemaPath_ dataPathToSchemaPath(const dataPath_& path);
Václav Kubernátbbfd1fa2019-12-13 13:51:28 +0100145std::string escapeListKeyString(const std::string& what);
Václav Kubernát24df80e2018-06-06 15:18:03 +0200146
147BOOST_FUSION_ADAPT_STRUCT(container_, m_name)
148BOOST_FUSION_ADAPT_STRUCT(listElement_, m_name, m_keys)
Václav Kubernát5b8a8f32020-05-20 00:57:22 +0200149BOOST_FUSION_ADAPT_STRUCT(leafListElement_, m_name, m_value)
Václav Kubernát744f57f2018-06-29 22:46:26 +0200150BOOST_FUSION_ADAPT_STRUCT(module_, m_name)
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200151BOOST_FUSION_ADAPT_STRUCT(dataNode_, m_prefix, m_suffix)
152BOOST_FUSION_ADAPT_STRUCT(schemaNode_, m_prefix, m_suffix)
Václav Kubernátd6fd2492018-11-19 15:11:16 +0100153BOOST_FUSION_ADAPT_STRUCT(dataPath_, m_scope, m_nodes, m_trailingSlash)
154BOOST_FUSION_ADAPT_STRUCT(schemaPath_, m_scope, m_nodes, m_trailingSlash)