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
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.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