blob: 966f771ceaf07c8acea6e8159f351a6cade472fe [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át509ce652019-05-29 19:46:44 +020013#include <boost/variant/variant.hpp>
Václav Kubernát24df80e2018-06-06 15:18:03 +020014#include <map>
15#include <vector>
16
Václav Kubernáteeb38842019-03-20 19:46:05 +010017#include "ast_values.hpp"
18
Václav Kubernátefcac932020-01-10 15:26:32 +010019enum class Prefixes {
20 Always,
21 WhenNeeded
22};
23
Václav Kubernát24df80e2018-06-06 15:18:03 +020024struct nodeup_ {
25 bool operator==(const nodeup_&) const
26 {
27 return true;
28 }
29};
30
31struct container_ {
32 container_() = default;
33 container_(const std::string& name);
34
35 bool operator==(const container_& b) const;
36
37 std::string m_name;
38};
39
40struct leaf_ {
41 leaf_() = default;
42 leaf_(const std::string& name);
43
44 bool operator==(const leaf_& b) const;
45
46 std::string m_name;
47};
48
49struct listElement_ {
50 listElement_() {}
Václav Kubernát7707cae2020-01-16 12:04:53 +010051 listElement_(const std::string& listName, const std::map<std::string, leaf_data_>& keys);
Václav Kubernát24df80e2018-06-06 15:18:03 +020052
53 bool operator==(const listElement_& b) const;
54
55 std::string m_name;
Václav Kubernát7707cae2020-01-16 12:04:53 +010056 std::map<std::string, leaf_data_> m_keys;
Václav Kubernát24df80e2018-06-06 15:18:03 +020057};
58
Václav Kubernát2eaceb82018-10-08 19:56:30 +020059struct list_ {
60 list_() {}
61 list_(const std::string& listName);
62
63 bool operator==(const list_& b) const;
64
65 std::string m_name;
66};
67
Václav Kubernát2eaceb82018-10-08 19:56:30 +020068struct schemaNode_ {
69 boost::optional<module_> m_prefix;
70 boost::variant<container_, list_, nodeup_, leaf_> m_suffix;
71
72 schemaNode_();
73 schemaNode_(decltype(m_suffix) node);
74 schemaNode_(module_ module, decltype(m_suffix) node);
75 bool operator==(const schemaNode_& b) const;
76};
77
78struct dataNode_ {
Václav Kubernát744f57f2018-06-29 22:46:26 +020079 boost::optional<module_> m_prefix;
Václav Kubernát5c75b252018-10-10 18:33:47 +020080 boost::variant<container_, listElement_, nodeup_, leaf_, list_> m_suffix;
Václav Kubernát24df80e2018-06-06 15:18:03 +020081
Václav Kubernát2eaceb82018-10-08 19:56:30 +020082 dataNode_();
83 dataNode_(decltype(m_suffix) node);
84 dataNode_(module_ module, decltype(m_suffix) node);
85 bool operator==(const dataNode_& b) const;
Václav Kubernát744f57f2018-06-29 22:46:26 +020086};
87
Václav Kubernátd6fd2492018-11-19 15:11:16 +010088enum class TrailingSlash {
89 Present,
90 NonPresent
91};
92
Václav Kubernátb6ff0b62018-08-30 16:14:53 +020093enum class Scope {
Václav Kubernát37171a12018-08-31 17:01:48 +020094 Absolute,
95 Relative
96};
97
Václav Kubernát2eaceb82018-10-08 19:56:30 +020098struct schemaPath_ {
99 bool operator==(const schemaPath_& b) const;
Václav Kubernát37171a12018-08-31 17:01:48 +0200100 Scope m_scope = Scope::Relative;
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200101 std::vector<schemaNode_> m_nodes;
Václav Kubernátd6fd2492018-11-19 15:11:16 +0100102 TrailingSlash m_trailingSlash = TrailingSlash::NonPresent;
Václav Kubernát744f57f2018-06-29 22:46:26 +0200103};
104
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200105struct dataPath_ {
106 bool operator==(const dataPath_& b) const;
107 Scope m_scope = Scope::Relative;
108 std::vector<dataNode_> m_nodes;
Václav Kubernátd6fd2492018-11-19 15:11:16 +0100109 TrailingSlash m_trailingSlash = TrailingSlash::NonPresent;
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200110};
Václav Kubernát744f57f2018-06-29 22:46:26 +0200111
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200112std::string nodeToSchemaString(decltype(dataPath_::m_nodes)::value_type node);
113
Václav Kubernátefcac932020-01-10 15:26:32 +0100114std::string pathToDataString(const dataPath_& path, Prefixes prefixes);
115std::string pathToSchemaString(const schemaPath_& path, Prefixes prefixes);
116std::string pathToSchemaString(const dataPath_& path, Prefixes prefixes);
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200117schemaNode_ dataNodeToSchemaNode(const dataNode_& node);
118schemaPath_ dataPathToSchemaPath(const dataPath_& path);
Václav Kubernátbbfd1fa2019-12-13 13:51:28 +0100119std::string escapeListKeyString(const std::string& what);
Václav Kubernát24df80e2018-06-06 15:18:03 +0200120
121BOOST_FUSION_ADAPT_STRUCT(container_, m_name)
122BOOST_FUSION_ADAPT_STRUCT(listElement_, m_name, m_keys)
Václav Kubernát744f57f2018-06-29 22:46:26 +0200123BOOST_FUSION_ADAPT_STRUCT(module_, m_name)
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200124BOOST_FUSION_ADAPT_STRUCT(dataNode_, m_prefix, m_suffix)
125BOOST_FUSION_ADAPT_STRUCT(schemaNode_, m_prefix, m_suffix)
Václav Kubernátd6fd2492018-11-19 15:11:16 +0100126BOOST_FUSION_ADAPT_STRUCT(dataPath_, m_scope, m_nodes, m_trailingSlash)
127BOOST_FUSION_ADAPT_STRUCT(schemaPath_, m_scope, m_nodes, m_trailingSlash)