blob: 9638684b7648507ac8e6b6a4e690b77a0106564b [file] [log] [blame]
Václav Kubernát8cd63422018-03-19 17:10:13 +01001/*
2 * Copyright (C) 2018 CESNET, https://photonics.cesnet.cz/
Václav Kubernátd6662962018-03-22 17:41:33 +01003 * Copyright (C) 2018 FIT CVUT, https://fit.cvut.cz/
Václav Kubernát8cd63422018-03-19 17:10:13 +01004 *
5 * Written by Václav Kubernát <kubervac@fit.cvut.cz>
6 *
7*/
8#pragma once
9#include <boost/spirit/home/x3.hpp>
Václav Kubernát8cd63422018-03-19 17:10:13 +010010#include <boost/spirit/home/x3/support/ast/position_tagged.hpp>
Václav Kubernátb96eef72018-05-04 19:10:22 +020011#include <boost/spirit/home/x3/support/utility/error_reporting.hpp>
Václav Kubernátd6662962018-03-22 17:41:33 +010012
Václav Kubernát8cd63422018-03-19 17:10:13 +010013#include <boost/fusion/adapted/struct/adapt_struct.hpp>
14#include <boost/fusion/include/adapt_struct.hpp>
Václav Kubernátb96eef72018-05-04 19:10:22 +020015#include <boost/fusion/include/std_pair.hpp>
16#include <boost/variant.hpp>
17#include <map>
Václav Kubernátd6662962018-03-22 17:41:33 +010018#include <vector>
19
Václav Kubernát94938b72018-05-04 15:12:24 +020020#include "utils.hpp"
Václav Kubernát8cd63422018-03-19 17:10:13 +010021namespace x3 = boost::spirit::x3;
22namespace ascii = boost::spirit::x3::ascii;
23
Václav Kubernát8cd63422018-03-19 17:10:13 +010024using ascii::space;
Václav Kubernát48fc3832018-05-28 14:21:22 +020025using x3::_attr;
26using x3::alnum;
27using x3::alpha;
28using x3::char_;
29using x3::expect;
30using x3::lexeme;
31using x3::lit;
Václav Kubernátb96eef72018-05-04 19:10:22 +020032using boost::fusion::operator<<;
33
34
35using keyValue_ = std::pair<std::string, std::string>;
36
Václav Kubernát8cd63422018-03-19 17:10:13 +010037
38struct parser_context_tag;
39
Václav Kubernát60d6f292018-05-25 09:45:32 +020040
41struct nodeup_ {
42 bool operator==(const nodeup_&) const
43 {
Václav Kubernát48fc3832018-05-28 14:21:22 +020044 return true;
Václav Kubernát60d6f292018-05-25 09:45:32 +020045 }
46};
47
Václav Kubernátd6662962018-03-22 17:41:33 +010048struct container_ {
Václav Kubernátb96eef72018-05-04 19:10:22 +020049 container_() = default;
Václav Kubernátd6662962018-03-22 17:41:33 +010050 container_(const std::string& name);
51
52 bool operator==(const container_& b) const;
53
Václav Kubernát8cd63422018-03-19 17:10:13 +010054 std::string m_name;
55};
56
Václav Kubernát07204242018-06-04 18:12:09 +020057struct leaf_ {
58 leaf_() = default;
59 leaf_(const std::string& name);
60
61 bool operator==(const leaf_& b) const;
62
63 std::string m_name;
64};
65
Václav Kubernátb96eef72018-05-04 19:10:22 +020066
67struct list_ {
68 std::vector<std::string> m_keys;
69};
70
71struct listElement_ {
72 listElement_() {}
73 listElement_(const std::string& listName, const std::map<std::string, std::string>& keys);
74
75 bool operator==(const listElement_& b) const;
76
Václav Kubernát0b76a042018-05-16 20:16:47 +020077 std::string m_name;
Václav Kubernátb96eef72018-05-04 19:10:22 +020078 std::map<std::string, std::string> m_keys;
79};
80
Václav Kubernát8cd63422018-03-19 17:10:13 +010081
Václav Kubernátd6662962018-03-22 17:41:33 +010082struct path_ {
83 bool operator==(const path_& b) const;
Václav Kubernát07204242018-06-04 18:12:09 +020084 std::vector<boost::variant<container_, listElement_, nodeup_, leaf_>> m_nodes;
Václav Kubernát8cd63422018-03-19 17:10:13 +010085};
86
Václav Kubernát8cd63422018-03-19 17:10:13 +010087
Václav Kubernátb96eef72018-05-04 19:10:22 +020088struct cd_ : x3::position_tagged {
Václav Kubernátd6662962018-03-22 17:41:33 +010089 bool operator==(const cd_& b) const;
Václav Kubernát8cd63422018-03-19 17:10:13 +010090 path_ m_path;
91};
92
Václav Kubernátb61336d2018-05-28 17:35:03 +020093struct create_ : x3::position_tagged {
94 bool operator==(const create_& b) const;
95 path_ m_path;
96};
97
98struct delete_ : x3::position_tagged {
99 bool operator==(const delete_& b) const;
100 path_ m_path;
101};
102
Václav Kubernát07204242018-06-04 18:12:09 +0200103struct set_ : x3::position_tagged {
104 bool operator==(const set_& b) const;
105 path_ m_path;
106 std::string m_data;
107};
108
109using command_ = boost::variant<cd_, create_, delete_, set_>;
Václav Kubernátb61336d2018-05-28 17:35:03 +0200110
Václav Kubernát0a2a2e82018-05-11 13:59:12 +0200111BOOST_FUSION_ADAPT_STRUCT(container_, m_name)
Václav Kubernát0b76a042018-05-16 20:16:47 +0200112BOOST_FUSION_ADAPT_STRUCT(listElement_, m_name, m_keys)
Václav Kubernát0a2a2e82018-05-11 13:59:12 +0200113BOOST_FUSION_ADAPT_STRUCT(path_, m_nodes)
Václav Kubernát8cd63422018-03-19 17:10:13 +0100114BOOST_FUSION_ADAPT_STRUCT(cd_, m_path)
Václav Kubernátb61336d2018-05-28 17:35:03 +0200115BOOST_FUSION_ADAPT_STRUCT(create_, m_path)
116BOOST_FUSION_ADAPT_STRUCT(delete_, m_path)
Václav Kubernát07204242018-06-04 18:12:09 +0200117BOOST_FUSION_ADAPT_STRUCT(set_, m_path, m_data)