blob: 9138946dbdcea92c54975527b1a98a93e6244ebf [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_ {
51 leafList_();
52 leafList_(const std::string& name);
53
54 bool operator==(const leafList_& b) const;
55
56 std::string m_name;
57};
58
59struct leafListElement_ {
60 bool operator==(const leafListElement_& b) const;
61
62 std::string m_name;
63 leaf_data_ m_value;
64};
65
Václav Kubernát24df80e2018-06-06 15:18:03 +020066struct listElement_ {
67 listElement_() {}
Václav Kubernátc15fe822020-06-04 11:28:39 +020068 listElement_(const std::string& listName, const ListInstance& keys);
Václav Kubernát24df80e2018-06-06 15:18:03 +020069
70 bool operator==(const listElement_& b) const;
71
72 std::string m_name;
Václav Kubernáta93f9002020-05-28 03:09:42 +020073 ListInstance m_keys;
Václav Kubernát24df80e2018-06-06 15:18:03 +020074};
75
Václav Kubernát2eaceb82018-10-08 19:56:30 +020076struct list_ {
77 list_() {}
78 list_(const std::string& listName);
79
80 bool operator==(const list_& b) const;
81
82 std::string m_name;
83};
84
Václav Kubernát2eaceb82018-10-08 19:56:30 +020085struct schemaNode_ {
86 boost::optional<module_> m_prefix;
Václav Kubernátb5ca1542020-05-27 01:03:54 +020087 std::variant<container_, list_, nodeup_, leaf_, leafList_> m_suffix;
Václav Kubernát2eaceb82018-10-08 19:56:30 +020088
89 schemaNode_();
90 schemaNode_(decltype(m_suffix) node);
91 schemaNode_(module_ module, decltype(m_suffix) node);
92 bool operator==(const schemaNode_& b) const;
93};
94
95struct dataNode_ {
Václav Kubernát744f57f2018-06-29 22:46:26 +020096 boost::optional<module_> m_prefix;
Václav Kubernátb5ca1542020-05-27 01:03:54 +020097 std::variant<container_, listElement_, nodeup_, leaf_, leafListElement_, leafList_, list_> m_suffix;
Václav Kubernát24df80e2018-06-06 15:18:03 +020098
Václav Kubernát2eaceb82018-10-08 19:56:30 +020099 dataNode_();
100 dataNode_(decltype(m_suffix) node);
Václav Kubernát2db124c2020-05-28 21:58:36 +0200101 dataNode_(boost::optional<module_> module, decltype(m_suffix) node);
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200102 dataNode_(module_ module, decltype(m_suffix) node);
103 bool operator==(const dataNode_& b) const;
Václav Kubernát744f57f2018-06-29 22:46:26 +0200104};
105
Václav Kubernátd6fd2492018-11-19 15:11:16 +0100106enum class TrailingSlash {
107 Present,
108 NonPresent
109};
110
Václav Kubernátb6ff0b62018-08-30 16:14:53 +0200111enum class Scope {
Václav Kubernát37171a12018-08-31 17:01:48 +0200112 Absolute,
113 Relative
114};
115
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200116struct schemaPath_ {
117 bool operator==(const schemaPath_& b) const;
Václav Kubernát37171a12018-08-31 17:01:48 +0200118 Scope m_scope = Scope::Relative;
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200119 std::vector<schemaNode_> m_nodes;
Václav Kubernátd6fd2492018-11-19 15:11:16 +0100120 TrailingSlash m_trailingSlash = TrailingSlash::NonPresent;
Václav Kubernát744f57f2018-06-29 22:46:26 +0200121};
122
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200123struct dataPath_ {
124 bool operator==(const dataPath_& b) const;
125 Scope m_scope = Scope::Relative;
126 std::vector<dataNode_> m_nodes;
Václav Kubernátd6fd2492018-11-19 15:11:16 +0100127 TrailingSlash m_trailingSlash = TrailingSlash::NonPresent;
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200128};
Václav Kubernát744f57f2018-06-29 22:46:26 +0200129
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200130std::string nodeToSchemaString(decltype(dataPath_::m_nodes)::value_type node);
131
Václav Kubernátefcac932020-01-10 15:26:32 +0100132std::string pathToDataString(const dataPath_& path, Prefixes prefixes);
133std::string pathToSchemaString(const schemaPath_& path, Prefixes prefixes);
134std::string pathToSchemaString(const dataPath_& path, Prefixes prefixes);
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200135schemaNode_ dataNodeToSchemaNode(const dataNode_& node);
136schemaPath_ dataPathToSchemaPath(const dataPath_& path);
Václav Kubernátbbfd1fa2019-12-13 13:51:28 +0100137std::string escapeListKeyString(const std::string& what);
Václav Kubernát24df80e2018-06-06 15:18:03 +0200138
139BOOST_FUSION_ADAPT_STRUCT(container_, m_name)
140BOOST_FUSION_ADAPT_STRUCT(listElement_, m_name, m_keys)
Václav Kubernát5b8a8f32020-05-20 00:57:22 +0200141BOOST_FUSION_ADAPT_STRUCT(leafListElement_, m_name, m_value)
Václav Kubernát744f57f2018-06-29 22:46:26 +0200142BOOST_FUSION_ADAPT_STRUCT(module_, m_name)
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200143BOOST_FUSION_ADAPT_STRUCT(dataNode_, m_prefix, m_suffix)
144BOOST_FUSION_ADAPT_STRUCT(schemaNode_, m_prefix, m_suffix)
Václav Kubernátd6fd2492018-11-19 15:11:16 +0100145BOOST_FUSION_ADAPT_STRUCT(dataPath_, m_scope, m_nodes, m_trailingSlash)
146BOOST_FUSION_ADAPT_STRUCT(schemaPath_, m_scope, m_nodes, m_trailingSlash)