Mercurial > irccd
annotate irccdctl/rule_add_cli.cpp @ 546:fd96de07657a
Irccd: switch Irccd.Timer to Boost, closes #572
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 22 Nov 2017 19:32:56 +0100 |
parents | 7cd7b2cdf923 |
children | 27587ff92a64 |
rev | line source |
---|---|
528
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * rule_add_cli.cpp -- implementation of irccdctl rule-add |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr> |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <irccd/options.hpp> |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <irccd/string_util.hpp> |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include "rule_add_cli.hpp" |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 namespace irccd { |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 namespace ctl { |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 std::string rule_add_cli::name() const |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 { |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 return "rule-add"; |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 } |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 void rule_add_cli::exec(ctl::controller& ctl, const std::vector<std::string>& args) |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 { |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 static const option::options options{ |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 { "-c", true }, |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 { "--add-channel", true }, |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 { "-e", true }, |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 { "--add-event", true }, |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 { "-i", true }, |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 { "--index", true }, |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 { "-p", true }, |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 { "--add-plugin", true }, |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 { "-s", true }, |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 { "--add-server", true } |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 }; |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 auto copy = args; |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 auto result = option::read(copy, options); |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 if (copy.size() < 1) |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 throw std::invalid_argument("rule-add requires at least 1 argument"); |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 auto json = nlohmann::json::object({ |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 { "command", "rule-add" }, |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 { "channels", nlohmann::json::array() }, |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 { "events", nlohmann::json::array() }, |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 { "plugins", nlohmann::json::array() }, |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 { "servers", nlohmann::json::array() } |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 }); |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 // All sets. |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 for (const auto& pair : result) { |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 if (pair.first == "-c" || pair.first == "--add-channel") |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 json["channels"].push_back(pair.second); |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 if (pair.first == "-e" || pair.first == "--add-event") |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 json["events"].push_back(pair.second); |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 if (pair.first == "-p" || pair.first == "--add-plugin") |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 json["plugins"].push_back(pair.second); |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 if (pair.first == "-s" || pair.first == "--add-server") |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 json["servers"].push_back(pair.second); |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 } |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 // Index. |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 if (result.count("-i") > 0) |
530
7cd7b2cdf923
Common: import to_int / to_uint
David Demelier <markand@malikania.fr>
parents:
528
diff
changeset
|
76 json["index"] = string_util::to_uint<unsigned>(result.find("-i")->second); |
528
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 if (result.count("--index") > 0) |
530
7cd7b2cdf923
Common: import to_int / to_uint
David Demelier <markand@malikania.fr>
parents:
528
diff
changeset
|
78 json["index"] = string_util::to_uint<unsigned>(result.find("--index")->second); |
528
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 // And action. |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 if (copy[0] != "accept" && copy[0] != "drop") |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 throw std::runtime_error(string_util::sprintf("invalid action '%s'", copy[0])); |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 json["action"] = copy[0]; |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 request(ctl, json); |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 } |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 } // !ctl |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 |
9daccaeedcce
Irccdctl: split cli.hpp, closes #726
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 } // !irccd |