Mercurial > irccd
annotate irccdctl/alias.hpp @ 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 | a88796ed040a |
children | 986ed3a7575d |
rev | line source |
---|---|
348 | 1 /* |
2 * alias.hpp -- create irccdctl aliases | |
3 * | |
394 | 4 * Copyright (c) 2013-2017 David Demelier <markand@malikania.fr> |
348 | 5 * |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
19 #ifndef IRCCD_ALIAS_HPP | |
20 #define IRCCD_ALIAS_HPP | |
21 | |
22 /** | |
23 * \file alias.hpp | |
24 * \brief Create irccdctl aliases. | |
25 */ | |
26 | |
27 #include <ostream> | |
28 #include <string> | |
29 #include <vector> | |
30 | |
31 #include "sysconfig.hpp" | |
32 | |
33 namespace irccd { | |
34 | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
35 namespace ctl { |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
36 |
348 | 37 /** |
38 * \brief Describe an alias argument. | |
39 * | |
40 * When the user specify arguments, it can precise an applied argument or a | |
41 * placeholder that will be substituted during command line invocation. | |
42 * | |
43 * Placeholders are placed using %n where n is an integer starting from 0. | |
44 */ | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
45 class alias_arg { |
348 | 46 private: |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
47 std::string value_; |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
48 bool is_placeholder_; |
348 | 49 |
50 public: | |
51 /** | |
52 * Construct an argument. | |
53 * | |
54 * \pre value must not be empty | |
55 * \param value the value | |
56 */ | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
57 alias_arg(std::string value); |
348 | 58 |
59 /** | |
60 * Check if the argument is a placeholder. | |
61 * | |
62 * \return true if the argument is a placeholder | |
63 */ | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
64 inline bool is_placeholder() const noexcept |
348 | 65 { |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
66 return is_placeholder_; |
348 | 67 } |
68 | |
69 /** | |
70 * Get the placeholder index (e.g %0 returns 0) | |
71 * | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
72 * \pre is_placeholder() must return true |
348 | 73 * \return the position |
74 */ | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
75 unsigned index() const noexcept; |
348 | 76 |
77 /** | |
78 * Get the real value. | |
79 * | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
80 * \pre is_placeholder() must return false |
348 | 81 * \return the value |
82 */ | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
83 const std::string& value() const noexcept; |
348 | 84 |
85 /** | |
86 * Output the alias to the stream. | |
87 * | |
88 * \param out the output stream | |
89 * \return out | |
90 */ | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
91 friend std::ostream& operator<<(std::ostream& out, const alias_arg&); |
348 | 92 }; |
93 | |
94 /** | |
95 * \brief Describe a user-provided alias command. | |
96 * | |
97 * An alias command is just a command with a set of applied or placeholders | |
98 * arguments. | |
99 */ | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
100 class alias_command { |
348 | 101 private: |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
102 std::string command_; |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
103 std::vector<alias_arg> args_; |
348 | 104 |
105 public: | |
106 /** | |
107 * Create an alias command. | |
108 * | |
109 * \param command the command | |
110 * \param args the arguments | |
111 */ | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
112 inline alias_command(std::string command, std::vector<alias_arg> args = {}) noexcept |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
113 : command_(std::move(command)) |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
114 , args_(std::move(args)) |
348 | 115 { |
116 } | |
117 | |
118 /** | |
119 * Get the command to execute. | |
120 * | |
121 * \return the command name | |
122 */ | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
123 inline const std::string& command() const noexcept |
348 | 124 { |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
125 return command_; |
348 | 126 } |
127 | |
128 /** | |
129 * Get the arguments. | |
130 * | |
131 * \return the arguments | |
132 */ | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
133 inline const std::vector<alias_arg>& args() const noexcept |
348 | 134 { |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
135 return args_; |
348 | 136 } |
137 }; | |
138 | |
139 /** | |
140 * \brief A set of commands to execute with their arguments. | |
141 * | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
142 * An alias is a composition of alias_command, typically, the user is able to |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
143 * set an alias that execute a list of specified commands in order they are |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
144 * defined. |
348 | 145 */ |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
146 class alias : public std::vector<alias_command> { |
348 | 147 private: |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
148 std::string name_; |
348 | 149 |
150 public: | |
151 /** | |
152 * Create an alias. | |
153 * | |
154 * \param name the alias name | |
155 */ | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
156 inline alias(std::string name) noexcept |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
157 : name_(std::move(name)) |
348 | 158 { |
159 } | |
160 | |
161 /** | |
162 * Get the alias name. | |
163 * | |
164 * \return the name | |
165 */ | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
166 inline const std::string& name() const noexcept |
348 | 167 { |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
168 return name_; |
348 | 169 } |
170 }; | |
171 | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
172 } // !ctl |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
173 |
348 | 174 } // !irccd |
175 | |
176 #endif // !IRCCD_ALIAS_HPP |