Mercurial > irccd
annotate irccdctl/cli.hpp @ 655:cda30ca5bb76
Irccd: style (controller) #782
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 27 Mar 2018 20:30:59 +0200 |
parents | 27587ff92a64 |
children | 252506d9839b |
rev | line source |
---|---|
344
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * cli.hpp -- command line for irccdctl |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
628
27587ff92a64
Misc: update copyrights
David Demelier <markand@malikania.fr>
parents:
603
diff
changeset
|
4 * Copyright (c) 2013-2018 David Demelier <markand@malikania.fr> |
344
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
603
986ed3a7575d
Misc: fix includes style, closes #732
David Demelier <markand@malikania.fr>
parents:
528
diff
changeset
|
19 #ifndef IRCCD_CTL_CLI_HPP |
986ed3a7575d
Misc: fix includes style, closes #732
David Demelier <markand@malikania.fr>
parents:
528
diff
changeset
|
20 #define IRCCD_CTL_CLI_HPP |
344
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
528
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
22 #include <stdexcept> |
344
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include <string> |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 #include <vector> |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 #include <json.hpp> |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 namespace irccd { |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
30 namespace ctl { |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
31 |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
32 class controller; |
344
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 |
345
006452e4a997
Irccdctl: unify cli commands
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
34 /** |
006452e4a997
Irccdctl: unify cli commands
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
35 * \brief Abstract CLI class. |
006452e4a997
Irccdctl: unify cli commands
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
36 */ |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
37 class cli { |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
38 public: |
528
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
39 /** |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
40 * Convenient handler for request function. |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
41 */ |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
42 using handler_t = std::function<void (nlohmann::json)>; |
344
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
44 private: |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
45 void recv_response(ctl::controller&, nlohmann::json, handler_t); |
344
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
47 protected: |
344
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 /** |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
49 * Convenient request helper. |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
50 * |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
51 * This function send and receive the response for the given request. It |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
52 * checks for an error code or string in the command result and throws it if |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
53 * any. |
344
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 * |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
55 * If handler is not null, it will be called once the command result has |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
56 * been received. |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
57 * |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
58 * This function may executes successive read calls until we get the |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
59 * response. |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
60 * |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
61 * \param ctl the controller |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
62 * \param json the json object |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
63 * \param handler the optional handler |
344
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 */ |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
65 void request(ctl::controller& ctl, nlohmann::json json, handler_t handler = nullptr); |
344
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 public: |
345
006452e4a997
Irccdctl: unify cli commands
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
68 /** |
528
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
69 * Default constructor. |
345
006452e4a997
Irccdctl: unify cli commands
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
70 */ |
528
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
71 cli() noexcept = default; |
345
006452e4a997
Irccdctl: unify cli commands
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
72 |
006452e4a997
Irccdctl: unify cli commands
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
73 /** |
528
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
74 * Virtual destructor defaulted. |
345
006452e4a997
Irccdctl: unify cli commands
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
75 */ |
528
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
76 virtual ~cli() noexcept = default; |
345
006452e4a997
Irccdctl: unify cli commands
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
77 |
006452e4a997
Irccdctl: unify cli commands
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
78 /** |
528
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
79 * Return the command name. |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
80 * |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
81 * \return the name |
345
006452e4a997
Irccdctl: unify cli commands
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
82 */ |
528
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
83 virtual std::string name() const = 0; |
345
006452e4a997
Irccdctl: unify cli commands
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
84 |
006452e4a997
Irccdctl: unify cli commands
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
85 /** |
528
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
86 * Execute the command. |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
87 * |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
88 * \param ctl the controller |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
89 * \param args the user arguments |
448
9be4f8a5cf1a
Irccdctl: implement rule-list
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
90 */ |
528
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
91 virtual void exec(ctl::controller& ctl, const std::vector<std::string>& args) = 0; |
359
6d598fea2689
Irccdctl: put back watch missing, closes #591
David Demelier <markand@malikania.fr>
parents:
355
diff
changeset
|
92 }; |
6d598fea2689
Irccdctl: put back watch missing, closes #591
David Demelier <markand@malikania.fr>
parents:
355
diff
changeset
|
93 |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
453
diff
changeset
|
94 } // !ctl |
345
006452e4a997
Irccdctl: unify cli commands
David Demelier <markand@malikania.fr>
parents:
344
diff
changeset
|
95 |
344
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 } // !irccd |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 |
603
986ed3a7575d
Misc: fix includes style, closes #732
David Demelier <markand@malikania.fr>
parents:
528
diff
changeset
|
98 #endif // !IRCCD_CTL_CLI_HPP |