annotate irccdctl/cli.hpp @ 628:27587ff92a64

Misc: update copyrights
author David Demelier <markand@malikania.fr>
date Tue, 09 Jan 2018 14:06:40 +0100
parents 986ed3a7575d
children 252506d9839b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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