blob: d0c0985ddb33c1144c09dd49c90a58850610c802 [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át57272422019-02-08 12:48:24 +010010#include <boost/mpl/vector.hpp>
Václav Kubernát509ce652019-05-29 19:46:44 +020011#include <boost/spirit/home/x3/support/ast/position_tagged.hpp>
Václav Kubernát24df80e2018-06-06 15:18:03 +020012#include "ast_path.hpp"
Václav Kubernát627f6152018-08-29 13:23:56 +020013#include "ast_values.hpp"
Václav Kubernát6a7dd4d2020-06-23 22:44:13 +020014#include "yang_operations.hpp"
Václav Kubernát24df80e2018-06-06 15:18:03 +020015
16namespace x3 = boost::spirit::x3;
Václav Kubernát24df80e2018-06-06 15:18:03 +020017
Václav Kubernát7707cae2020-01-16 12:04:53 +010018using keyValue_ = std::pair<std::string, leaf_data_>;
Václav Kubernát24df80e2018-06-06 15:18:03 +020019
Václav Kubernáte7d4aea2018-09-11 18:15:48 +020020enum class LsOption {
21 Recursive
22};
23
Václav Kubernát6d791432018-10-25 16:00:35 +020024struct discard_ : x3::position_tagged {
Václav Kubernát57272422019-02-08 12:48:24 +010025 static constexpr auto name = "discard";
Václav Kubernát054cc992019-02-21 14:23:52 +010026 static constexpr auto shortHelp = "discard - Discard current changes.";
27 static constexpr auto longHelp = R"(
28 discard
29
30 Discards current changes. Accepts no arguments.
31
32 Usage:
33 /> discard)";
Václav Kubernát6d791432018-10-25 16:00:35 +020034 bool operator==(const discard_& b) const;
35};
36
Václav Kubernát11afac72018-07-18 14:59:53 +020037struct ls_ : x3::position_tagged {
Václav Kubernát57272422019-02-08 12:48:24 +010038 static constexpr auto name = "ls";
Václav Kubernát054cc992019-02-21 14:23:52 +010039 static constexpr auto shortHelp = "ls - List available nodes.";
40 static constexpr auto longHelp = R"(
41 ls [--recursive] [path]
42
43 Lists available nodes in the current directory. Optionally
44 accepts a path argument. Accepts both schema paths and data
45 paths. Path starting with a forward slash means an absolute
46 path.
47
48 Usage:
49 /> ls
50 /> ls --recursive module:node
51 /> ls /module:node)";
Václav Kubernát11afac72018-07-18 14:59:53 +020052 bool operator==(const ls_& b) const;
Václav Kubernáte7d4aea2018-09-11 18:15:48 +020053 std::vector<LsOption> m_options;
Václav Kubernátbeaa8aa2020-04-29 22:39:34 +020054 boost::optional<boost::variant<dataPath_, schemaPath_, module_>> m_path;
Václav Kubernát11afac72018-07-18 14:59:53 +020055};
56
Václav Kubernát24df80e2018-06-06 15:18:03 +020057struct cd_ : x3::position_tagged {
Václav Kubernát57272422019-02-08 12:48:24 +010058 static constexpr auto name = "cd";
Václav Kubernát054cc992019-02-21 14:23:52 +010059 static constexpr auto shortHelp = "cd - Enter a different node.";
60 static constexpr auto longHelp = R"(
61 cd path
62
63 Enters a node specified by path. Only accepts data paths.
64
65 Usage:
66 /> cd /module:node/node2
67 /> cd ..)";
Václav Kubernát24df80e2018-06-06 15:18:03 +020068 bool operator==(const cd_& b) const;
Václav Kubernát2eaceb82018-10-08 19:56:30 +020069 dataPath_ m_path;
Václav Kubernát24df80e2018-06-06 15:18:03 +020070};
71
72struct create_ : x3::position_tagged {
Václav Kubernát57272422019-02-08 12:48:24 +010073 static constexpr auto name = "create";
Václav Kubernát054cc992019-02-21 14:23:52 +010074 static constexpr auto shortHelp = "create - Create a presence container.";
75 static constexpr auto longHelp = R"(
Václav Kubernátf5f64f02019-03-19 17:15:47 +010076 create path
Václav Kubernát054cc992019-02-21 14:23:52 +010077
Václav Kubernátf5f64f02019-03-19 17:15:47 +010078 Creates a presence container or a list instance specified by path.
Václav Kubernát054cc992019-02-21 14:23:52 +010079
80 Usage:
Václav Kubernátf5f64f02019-03-19 17:15:47 +010081 /> create /module:pContainer
82 /> create /module:list[key=value][anotherKey=value])";
Václav Kubernát24df80e2018-06-06 15:18:03 +020083 bool operator==(const create_& b) const;
Václav Kubernát2eaceb82018-10-08 19:56:30 +020084 dataPath_ m_path;
Václav Kubernát24df80e2018-06-06 15:18:03 +020085};
86
87struct delete_ : x3::position_tagged {
Václav Kubernát57272422019-02-08 12:48:24 +010088 static constexpr auto name = "delete";
Václav Kubernát054cc992019-02-21 14:23:52 +010089 static constexpr auto shortHelp = "delete - Delete a presence container.";
90 static constexpr auto longHelp = R"(
Václav Kubernátf5f64f02019-03-19 17:15:47 +010091 delete path
Václav Kubernát054cc992019-02-21 14:23:52 +010092
Václav Kubernátf5f64f02019-03-19 17:15:47 +010093 Deletes a presence container or a list instance specified by path.
Václav Kubernát054cc992019-02-21 14:23:52 +010094
95 Usage:
Václav Kubernátf5f64f02019-03-19 17:15:47 +010096 /> delete /module:pContainer
97 /> delete /module:list[key=value][anotherKey=value])";
Václav Kubernát24df80e2018-06-06 15:18:03 +020098 bool operator==(const delete_& b) const;
Václav Kubernát2eaceb82018-10-08 19:56:30 +020099 dataPath_ m_path;
Václav Kubernát24df80e2018-06-06 15:18:03 +0200100};
101
102struct set_ : x3::position_tagged {
Václav Kubernát57272422019-02-08 12:48:24 +0100103 static constexpr auto name = "set";
Václav Kubernát054cc992019-02-21 14:23:52 +0100104 static constexpr auto shortHelp = "set - Change value of a leaf.";
105 static constexpr auto longHelp = R"(
106 set path_to_leaf value
107
108 Changes the leaf specified by path to value.
109
110 Usage:
111 /> set /module:leaf 123
112 /> set /module:leaf abc)";
Václav Kubernát24df80e2018-06-06 15:18:03 +0200113 bool operator==(const set_& b) const;
Václav Kubernát2eaceb82018-10-08 19:56:30 +0200114 dataPath_ m_path;
Václav Kubernátebca2552018-06-08 19:06:02 +0200115 leaf_data_ m_data;
Václav Kubernát24df80e2018-06-06 15:18:03 +0200116};
117
Václav Kubernát812ee282018-08-30 17:10:03 +0200118struct commit_ : x3::position_tagged {
Václav Kubernát57272422019-02-08 12:48:24 +0100119 static constexpr auto name = "commit";
Václav Kubernát054cc992019-02-21 14:23:52 +0100120 static constexpr auto shortHelp = "commit - Commit current changes.";
121 static constexpr auto longHelp = R"(
122 commit
123
124 Commits the current changes. Accepts no arguments.
125
126 Usage:
127 /> commit)";
Václav Kubernát812ee282018-08-30 17:10:03 +0200128};
129
Václav Kubernátb6ff0b62018-08-30 16:14:53 +0200130struct get_ : x3::position_tagged {
Václav Kubernát57272422019-02-08 12:48:24 +0100131 static constexpr auto name = "get";
Václav Kubernát054cc992019-02-21 14:23:52 +0100132 static constexpr auto shortHelp = "get - Retrieve configuration from the server.";
133 static constexpr auto longHelp = R"(
134 get [path]
135
136 Retrieves configuration of the current node. Works recursively.
137 Optionally takes an argument specifying a path, the output will,
138 as if the user was in that node.
139
140 Usage:
141 /> get
142 /> get /module:path)";
Václav Kubernátb6ff0b62018-08-30 16:14:53 +0200143 bool operator==(const get_& b) const;
Václav Kubernát8f6bff32020-06-10 14:51:10 +0200144 boost::optional<boost::variant<dataPath_, module_>> m_path;
Václav Kubernátb6ff0b62018-08-30 16:14:53 +0200145};
Václav Kubernát812ee282018-08-30 17:10:03 +0200146
Václav Kubernát9cfcd872020-02-18 12:34:02 +0100147struct describe_ : x3::position_tagged {
148 static constexpr auto name = "describe";
149 static constexpr auto shortHelp = "describe - Print information about YANG tree path.";
150 static constexpr auto longHelp = R"(
151 describe <path>
152
153 Show documentation of YANG tree paths. In the YANG model, each item may
154 have an optional `description` which often explains the function of that
155 node to the end user. This command takes the description from the YANG
156 model and shows it to the user along with additional data, such as the type
157 of the node, units of leaf values, etc.
158
159 Usage:
160 /> describe /module:node)";
161 bool operator==(const describe_& b) const;
162
163 boost::variant<schemaPath_, dataPath_> m_path;
164};
165
Václav Kubernát7160a132020-04-03 02:11:01 +0200166struct copy_ : x3::position_tagged {
167 static constexpr auto name = "copy";
168 static constexpr auto shortHelp = "copy - copy configuration datastores around";
169 static constexpr auto longHelp = R"(
170 copy <source> <destination>
171
172 Usage:
173 /> copy running startup
174 /> copy startup running)";
175 bool operator==(const copy_& b) const;
176
177 Datastore m_source;
178 Datastore m_destination;
179};
180
Václav Kubernátbf65dd72020-05-28 02:32:31 +0200181enum class MoveMode {
182 Begin,
183 End,
184 Before,
185 After
186};
187
188struct move_ : x3::position_tagged {
189 static constexpr auto name = "move";
190 static constexpr auto shortHelp = "move - move (leaf)list instances around";
191 static constexpr auto longHelp = R"(
192 move <list-instance-path> begin
193 move <list-instance-path> end
194 move <list-instance-path> before <key>
195 move <list-instance-path> after <key>
196
197 Usage:
198 /> move mod:leaflist['abc'] begin
199 /> move mod:leaflist['def'] after 'abc'
200 /> move mod:interfaces['eth0'] after ['eth1'])";
201 bool operator==(const move_& b) const;
202
203 dataPath_ m_source;
204
205 std::variant<yang::move::Absolute, yang::move::Relative> m_destination;
206};
207
Václav Kubernát70d7f7a2020-06-23 14:40:40 +0200208struct dump_ : x3::position_tagged {
209 static constexpr auto name = "dump";
210 static constexpr auto shortHelp = "dump - dump entire content of the datastore";
211 static constexpr auto longHelp = R"(
212 dump xml|json
213
214 Usage:
215 /> dump xml
216 /> dump json)";
217 bool operator==(const dump_& other) const;
218
219 DataFormat m_format;
220};
221
Václav Kubernátaa4250a2020-07-22 00:02:23 +0200222struct prepare_ : x3::position_tagged {
223 static constexpr auto name = "prepare";
224 static constexpr auto shortHelp = "prepare - initiate RPC or action";
Václav Kubernáte7248b22020-06-26 15:38:59 +0200225 static constexpr auto longHelp = R"(
Václav Kubernátaa4250a2020-07-22 00:02:23 +0200226 prepare <path-to-rpc-or-action>
Václav Kubernáte7248b22020-06-26 15:38:59 +0200227
228 This command puts you into a mode where you can set your input parameters.
229
230 Usage:
Václav Kubernátaa4250a2020-07-22 00:02:23 +0200231 /> prepare <path-to-rpc-or-action>)";
232 bool operator==(const prepare_& other) const;
Václav Kubernáte7248b22020-06-26 15:38:59 +0200233
234 dataPath_ m_path;
235};
236
237struct exec_ : x3::position_tagged {
238 static constexpr auto name = "exec";
239 static constexpr auto shortHelp = "exec - execute RPC";
240 static constexpr auto longHelp = R"(
241 exec
242
243 This command executes the RPC you have previously initiated.
244
245 Usage:
246 /> exec)";
247 bool operator==(const exec_& other) const;
248};
249
250struct cancel_ : x3::position_tagged {
251 static constexpr auto name = "cancel";
252 static constexpr auto shortHelp = "cancel - cancel an ongoing RPC input";
253 static constexpr auto longHelp = R"(
254 cancel
255
256 This command cancels a previously entered RPC context.
257
258 Usage:
259 /> cancel)";
260 bool operator==(const cancel_& other) const;
261};
262
Václav Kubernát054cc992019-02-21 14:23:52 +0100263struct help_;
Václav Kubernátaa4250a2020-07-22 00:02:23 +0200264using CommandTypes = boost::mpl::vector<cancel_, cd_, commit_, copy_, create_, delete_, describe_, discard_, dump_, exec_, get_, help_, ls_, move_, prepare_, set_>;
Václav Kubernát054cc992019-02-21 14:23:52 +0100265struct help_ : x3::position_tagged {
266 static constexpr auto name = "help";
267 static constexpr auto shortHelp = "help - Print help for commands.";
268 static constexpr auto longHelp = R"(
269 help [command_name]
270
271 Print help for command_name. If used without an argument,
272 print short help for all commands.
273
274 Usage:
275 /> help
276 /> help cd
277 /> help help)";
278 bool operator==(const help_& b) const;
279
280 // The help command has got one optional argument – a command name (type).
281 // All commands are saved in CommandTypes, so we could just use that, but
282 // that way, Spirit would be default constructing the command structs,
283 // which is undesirable, so firstly we use mpl::transform to wrap
284 // CommandTypes with boost::type:
285 using WrappedCommandTypes = boost::mpl::transform<CommandTypes, boost::type<boost::mpl::_>>::type;
286 // Next, we create a variant over the wrapped types:
287 using CommandTypesVariant = boost::make_variant_over<WrappedCommandTypes>::type;
288 // Finally, we wrap the variant with boost::optional:
289 boost::optional<CommandTypesVariant> m_cmd;
290};
291
Václav Kubernát57272422019-02-08 12:48:24 +0100292// TODO: The usage of MPL won't be necessary after std::variant support is added to Spirit
293// https://github.com/boostorg/spirit/issues/270
Václav Kubernát57272422019-02-08 12:48:24 +0100294using command_ = boost::make_variant_over<CommandTypes>::type;
Václav Kubernát24df80e2018-06-06 15:18:03 +0200295
Václav Kubernáte7d4aea2018-09-11 18:15:48 +0200296BOOST_FUSION_ADAPT_STRUCT(ls_, m_options, m_path)
Václav Kubernát24df80e2018-06-06 15:18:03 +0200297BOOST_FUSION_ADAPT_STRUCT(cd_, m_path)
298BOOST_FUSION_ADAPT_STRUCT(create_, m_path)
299BOOST_FUSION_ADAPT_STRUCT(delete_, m_path)
Václav Kubernát24df80e2018-06-06 15:18:03 +0200300BOOST_FUSION_ADAPT_STRUCT(set_, m_path, m_data)
Václav Kubernátab538992019-03-06 15:30:50 +0100301BOOST_FUSION_ADAPT_STRUCT(enum_, m_value)
Václav Kubernátdab73ca2020-10-26 23:44:43 +0100302BOOST_FUSION_ADAPT_STRUCT(bits_, m_bits)
Václav Kubernátab538992019-03-06 15:30:50 +0100303BOOST_FUSION_ADAPT_STRUCT(binary_, m_value)
Václav Kubernáteeb38842019-03-20 19:46:05 +0100304BOOST_FUSION_ADAPT_STRUCT(identityRef_, m_prefix, m_value)
Václav Kubernát812ee282018-08-30 17:10:03 +0200305BOOST_FUSION_ADAPT_STRUCT(commit_)
Václav Kubernát9cfcd872020-02-18 12:34:02 +0100306BOOST_FUSION_ADAPT_STRUCT(describe_, m_path)
Václav Kubernát054cc992019-02-21 14:23:52 +0100307BOOST_FUSION_ADAPT_STRUCT(help_, m_cmd)
Václav Kubernát6d791432018-10-25 16:00:35 +0200308BOOST_FUSION_ADAPT_STRUCT(discard_)
Václav Kubernátb6ff0b62018-08-30 16:14:53 +0200309BOOST_FUSION_ADAPT_STRUCT(get_, m_path)
Václav Kubernát7160a132020-04-03 02:11:01 +0200310BOOST_FUSION_ADAPT_STRUCT(copy_, m_source, m_destination)
Václav Kubernátbf65dd72020-05-28 02:32:31 +0200311BOOST_FUSION_ADAPT_STRUCT(move_, m_source, m_destination)
Václav Kubernát70d7f7a2020-06-23 14:40:40 +0200312BOOST_FUSION_ADAPT_STRUCT(dump_, m_format)
Václav Kubernátaa4250a2020-07-22 00:02:23 +0200313BOOST_FUSION_ADAPT_STRUCT(prepare_, m_path)