Mercurial > irccd
annotate irccdctl/cli.cpp @ 344:4665fffff6f2
Irccdctl: new cli interface
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 12 Nov 2016 22:58:48 +0100 |
parents | |
children | 006452e4a997 |
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.cpp -- command line for irccdctl |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr> |
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 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <json.hpp> |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include "cli.hpp" |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include "irccdctl.hpp" |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include "util.hpp" |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 #include "elapsed-timer.hpp" |
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 namespace irccd { |
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 void Cli::check(const nlohmann::json &response) |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 { |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 if (!util::json::getBool(response, "status", false)) { |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 auto error = util::json::getString(response, "error"); |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 if (error.empty()) |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 throw std::runtime_error("command failed with an unknown error"); |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 throw std::runtime_error(error); |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 } |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 } |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 nlohmann::json Cli::request(Irccdctl &irccdctl, nlohmann::json args) |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 { |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 auto msg = nlohmann::json(); |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 if (!args.is_object()) |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 args = nlohmann::json::object(); |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 args.push_back({"command", m_name}); |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 irccdctl.client().request(args); |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 auto id = irccdctl.client().onMessage.connect([&] (auto input) { |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 msg = std::move(input); |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 }); |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 try { |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 ElapsedTimer timer; |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 while (!msg.is_object() && timer.elapsed() < 3000) |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 util::poller::poll(3000 - timer.elapsed(), irccdctl); |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 } catch (const std::exception &) { |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 irccdctl.client().onMessage.disconnect(id); |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 throw; |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 } |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 irccdctl.client().onMessage.disconnect(id); |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 std::cout << msg << std::endl; |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 if (!msg.is_object()) |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 throw std::runtime_error("no response received"); |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 if (util::json::getString(msg, "command") != m_name) |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 throw std::runtime_error("unexpected command result received"); |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 check(msg); |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 return msg; |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 } |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 void Cli::call(Irccdctl &irccdctl, nlohmann::json args) |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 { |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 check(request(irccdctl, args)); |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 } |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 |
4665fffff6f2
Irccdctl: new cli interface
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 } // !irccd |