annotate irccdctl/alias.h @ 61:adfc2be5ee30 release-2.0

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