Mercurial > irccd
annotate irccdctl/alias.hpp @ 865:a81136fc4b19
misc: add more warnings and fix some of them
author | David Demelier <markand@malikania.fr> |
---|---|
date | Thu, 25 Jul 2019 21:20:00 +0000 |
parents | 06cc2f95f479 |
children | 5e25439fe98d |
rev | line source |
---|---|
348 | 1 /* |
2 * alias.hpp -- create irccdctl aliases | |
3 * | |
824
06cc2f95f479
misc: happy new year!
David Demelier <markand@malikania.fr>
parents:
773
diff
changeset
|
4 * Copyright (c) 2013-2019 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 | |
603
986ed3a7575d
Misc: fix includes style, closes #732
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
19 #ifndef IRCCD_CTL_ALIAS_HPP |
986ed3a7575d
Misc: fix includes style, closes #732
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
20 #define IRCCD_CTL_ALIAS_HPP |
348 | 21 |
22 /** | |
23 * \file alias.hpp | |
24 * \brief Create irccdctl aliases. | |
25 */ | |
26 | |
603
986ed3a7575d
Misc: fix includes style, closes #732
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
27 #include <irccd/sysconfig.hpp> |
986ed3a7575d
Misc: fix includes style, closes #732
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
28 |
348 | 29 #include <ostream> |
30 #include <string> | |
31 #include <vector> | |
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: |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
47 std::string value_; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
48 bool is_placeholder_; |
348 | 49 |
50 public: | |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
51 /** |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
52 * Construct an argument. |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
53 * |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
54 * \pre value must not be empty |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
55 * \param value the value |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
56 */ |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
57 alias_arg(std::string value); |
348 | 58 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
59 /** |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
60 * Check if the argument is a placeholder. |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
61 * |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
62 * \return true if the argument is a placeholder |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
63 */ |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
64 auto is_placeholder() const noexcept -> bool; |
348 | 65 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
66 /** |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
67 * Get the placeholder index (e.g %0 returns 0) |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
68 * |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
69 * \pre is_placeholder() must return true |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
70 * \return the position |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
71 */ |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
72 auto get_index() const noexcept -> unsigned; |
348 | 73 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
74 /** |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
75 * Get the real value. |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
76 * |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
77 * \pre is_placeholder() must return false |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
78 * \return the value |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
79 */ |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
80 auto get_value() const noexcept -> const std::string&; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
81 }; |
348 | 82 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
83 /** |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
84 * Output the alias to the stream. |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
85 * |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
86 * \param out the output stream |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
87 * \return out |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
88 */ |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
89 auto operator<<(std::ostream& out, const alias_arg&) -> std::ostream&; |
348 | 90 |
91 /** | |
92 * \brief Describe a user-provided alias command. | |
93 * | |
94 * An alias command is just a command with a set of applied or placeholders | |
95 * arguments. | |
96 */ | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
97 class alias_command { |
348 | 98 private: |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
99 std::string command_; |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
100 std::vector<alias_arg> args_; |
348 | 101 |
102 public: | |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
103 /** |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
104 * Create an alias command. |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
105 * |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
106 * \param command the command |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
107 * \param args the arguments |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
108 */ |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
109 alias_command(std::string command, std::vector<alias_arg> args = {}) noexcept; |
348 | 110 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
111 /** |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
112 * Get the command to execute. |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
113 * |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
114 * \return the command name |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
115 */ |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
116 auto get_command() const noexcept -> const std::string&; |
348 | 117 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
118 /** |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
119 * Get the arguments. |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
120 * |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
121 * \return the arguments |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
122 */ |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
123 auto get_args() const noexcept -> const std::vector<alias_arg>&; |
348 | 124 }; |
125 | |
126 /** | |
127 * \brief A set of commands to execute with their arguments. | |
128 * | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
129 * 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
|
130 * 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
|
131 * defined. |
348 | 132 */ |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
133 class alias : public std::vector<alias_command> { |
348 | 134 private: |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
135 std::string name_; |
348 | 136 |
137 public: | |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
138 /** |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
139 * Create an alias. |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
140 * |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
141 * \param name the alias name |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
142 */ |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
143 alias(std::string name) noexcept; |
348 | 144 |
773
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
145 /** |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
146 * Get the alias name. |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
147 * |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
148 * \return the name |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
149 */ |
8c44bbcbbab9
Misc: style, cleanup and update
David Demelier <markand@malikania.fr>
parents:
628
diff
changeset
|
150 auto get_name() const noexcept -> const std::string&; |
348 | 151 }; |
152 | |
527
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
153 } // !ctl |
a88796ed040a
Irccdctl: switch to Boost.Asio, closes #697
David Demelier <markand@malikania.fr>
parents:
394
diff
changeset
|
154 |
348 | 155 } // !irccd |
156 | |
603
986ed3a7575d
Misc: fix includes style, closes #732
David Demelier <markand@malikania.fr>
parents:
527
diff
changeset
|
157 #endif // !IRCCD_CTL_ALIAS_HPP |