libosmscout 1.1.1
Loading...
Searching...
No Matches
CmdLineParsing.h
Go to the documentation of this file.
1#ifndef OSMSCOUT_UTIL_CMDLINEPARSING_H
2#define OSMSCOUT_UTIL_CMDLINEPARSING_H
3
4/*
5 This source is part of the libosmscout library
6 Copyright (C) 2017 Tim Teulings
7
8 This library is free software; you can redistribute it and/or
9 modify it under the terms of the GNU Lesser General Public
10 License as published by the Free Software Foundation; either
11 version 2.1 of the License, or (at your option) any later version.
12
13 This library is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
17
18 You should have received a copy of the GNU Lesser General Public
19 License along with this library; if not, write to the Free Software
20 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21*/
22
23#include <functional>
24#include <list>
25#include <map>
26#include <memory>
27#include <string>
28#include <vector>
29
31
32#include <osmscout/GeoCoord.h>
33
35
36namespace osmscout {
37
39 {
40 private:
41 std::vector<std::string> arguments;
42 size_t nextArg;
43
44 public:
45 CmdLineScanner(int argc, char* argv[]); // NOLINT
46
47 explicit CmdLineScanner(const std::vector<std::string>& arguments);
48
49 bool HasNextArg() const;
50 std::string PeakNextArg() const;
51 std::string Advance();
52 std::string GetCurrentArg() const;
53 };
54
55
57 {
58 private:
59 bool hasError;
60 std::string errorDescription;
61
62 public:
64
65 explicit CmdLineParseResult(const std::string& errorDescription);
66
67 bool Success() const;
68 bool HasError() const;
69
70 std::string GetErrorDescription() const;
71 };
72
74 {
75 private:
76 std::string optionName; //<! The unqualified option name
77 std::string argumentName; //<! The actual command line argument name
78
79 protected:
80 std::string GetOptionName() const;
81 std::string GetArgumentName() const;
82
83 public:
84 virtual ~CmdLineArgParser()=default;
85
86 void SetOptionName(const std::string& optionName);
87 void SetArgumentName(const std::string& argumentName);
88
89 virtual std::string GetOptionHint() const = 0;
90 virtual std::string GetPositionalHint(const std::string& positional) const = 0;
92 };
93
94 using CmdLineArgParserRef = std::shared_ptr<CmdLineArgParser>;
95
97 {
98 public:
99 using SetterFunction = std::function<void (const bool &)>;
100
101 private:
102 SetterFunction setter;
103
104 public:
106
107 std::string GetOptionHint() const override;
108 std::string GetPositionalHint(const std::string& positional) const override;
109
111 };
112
114 {
115 public:
116 using SetterFunction = std::function<void (const std::string &)>;
117
118 private:
119 SetterFunction setter;
120 std::string lastArgumentCalled;
121
122 public:
124
125 std::string GetOptionHint() const override;
126 std::string GetPositionalHint(const std::string& positional) const override;
127
129 };
130
132 {
133 public:
134 using SetterFunction = std::function<void (const bool &)>;
135
136 private:
137 SetterFunction setter;
138
139 public:
141
142 std::string GetOptionHint() const override;
143 std::string GetPositionalHint(const std::string& positional) const override;
144
146 };
147
149 {
150 public:
151 using SetterFunction = std::function<void (const std::string &)>;
152
153 private:
154 SetterFunction setter;
155
156 public:
158
159 std::string GetOptionHint() const override;
160 std::string GetPositionalHint(const std::string& positional) const override;
161
163 };
164
166 {
167 public:
168 using AppendFunction = std::function<void (const std::string &)>;
169
170 private:
171 AppendFunction appender;
172
173 public:
175
176 std::string GetOptionHint() const override;
177 std::string GetPositionalHint(const std::string& positional) const override;
178
180 };
181
182 template<typename N>
184 {
185 public:
186 using SetterFunction = std::function<void (const N &)>;
187
188 private:
189 SetterFunction setter;
190
191 public:
193 : setter(setter)
194 {
195 // no code
196 }
197
198 std::string GetOptionHint() const override
199 {
200 return "number";
201 }
202
203 std::string GetPositionalHint(const std::string& positional) const override
204 {
205 return positional;
206 }
207
209 {
210 if (!scanner.HasNextArg()) {
211 return CmdLineParseResult("Missing value for number argument '"+GetArgumentName()+"'");
212 }
213
214 std::string valueString=scanner.Advance();
215 N value;
216
217 if (StringToNumber(valueString,value)) {
218 setter(value);
219 return {};
220 }
221
222 return CmdLineParseResult("Value for number argument '"+GetArgumentName()+"' is not a valid number '"+valueString+"'");
223 }
224 };
225
227 {
228 public:
229 using SetterFunction = std::function<void (const GeoCoord &)>;
230
231 private:
232 SetterFunction setter;
233
234 public:
236
237 std::string GetOptionHint() const override;
238 std::string GetPositionalHint(const std::string& positional) const override;
239
241 };
242
243 template<class ...Args>
245 {
246 return std::make_shared<CmdLineFlagArgParser>(std::forward<Args>(args)...);
247 }
248
249 template<class ...Args>
251 {
252 return std::make_shared<CmdLineAlternativeFlagArgParser>(std::forward<Args>(args)...);
253 }
254
255 template<class ...Args>
257 {
258 return std::make_shared<CmdLineBoolArgParser>(std::forward<Args>(args)...);
259 }
260
261 template<class ...Args>
263 {
264 return std::make_shared<CmdLineStringArgParser>(std::forward<Args>(args)...);
265 }
266
267 template<class ...Args>
269 {
270 return std::make_shared<CmdLineStringListArgParser>(std::forward<Args>(args)...);
271 }
272
273 template<class T, class ...Args>
275 {
276 return std::make_shared<CmdLineNumberArgParser<T>>(std::forward<Args>(args)...);
277 }
278
279 template<class ...Args>
281 {
282 return std::make_shared<CmdLineNumberArgParser<int>>(std::forward<Args>(args)...);
283 }
284
285 template<class ...Args>
287 {
288 return std::make_shared<CmdLineNumberArgParser<unsigned int>>(std::forward<Args>(args)...);
289 }
290
291 template<class ...Args>
293 {
294 return std::make_shared<CmdLineNumberArgParser<long>>(std::forward<Args>(args)...);
295 }
296
297 template<class ...Args>
299 {
300 return std::make_shared<CmdLineNumberArgParser<unsigned long>>(std::forward<Args>(args)...);
301 }
302
303 template<class ...Args>
305 {
306 return std::make_shared<CmdLineNumberArgParser<size_t>>(std::forward<Args>(args)...);
307 }
308
309 template<class ...Args>
311 {
312 return std::make_shared<CmdLineNumberArgParser<double>>(std::forward<Args>(args)...);
313 }
314
315 template<class ...Args>
317 {
318 return std::make_shared<CmdLineGeoCoordArgParser>(std::forward<Args>(args)...);
319 }
320
322 {
323 private:
324 struct CmdLineOption
325 {
326 CmdLineArgParserRef parser;
327 std::string option;
328 std::string argument;
329 bool stopParsing;
330
331 CmdLineOption(const CmdLineArgParserRef& parser,
332 const std::string& option,
333 const std::string& argument,
334 bool stopParsing)
335 : parser(parser),
336 option(option),
337 argument(argument),
338 stopParsing(stopParsing)
339 {
340 // no code
341 }
342 };
343
344 struct CmdLinePositional
345 {
346 CmdLineArgParserRef parser;
347 std::string positional;
348
349 CmdLinePositional(const CmdLineArgParserRef& parser,
350 const std::string& positional)
351 : parser(parser),
352 positional(positional)
353 {
354 // no code
355 }
356 };
357
358 struct CmdLineArgHelp
359 {
360 std::vector<std::string> argTemplates;
361 std::string helpString;
362
363 CmdLineArgHelp(const std::string& argTemplate,
364 const std::string& helpString)
365 : helpString(helpString)
366 {
367 argTemplates.push_back(argTemplate);
368 }
369
370 CmdLineArgHelp(const std::vector<std::string>& argTemplates,
371 const std::string& helpString)
372 : argTemplates(argTemplates),
373 helpString(helpString)
374 {
375 // no code
376 }
377 };
378
379 private:
380 std::string appName;
381 CmdLineScanner scanner;
382
383 std::map<std::string,CmdLineOption,std::less<>> options;
384 std::list<CmdLinePositional> positionals;
385 std::list<CmdLineArgHelp> optionHelps;
386 std::list<CmdLineArgHelp> positionalHelps;
387
388 public:
389 CmdLineParser(const std::string& appName,
390 int argc, char* argv[]); // NOLINT
391 CmdLineParser(const std::string& appName,
392 const std::vector<std::string>& arguments);
393
394 void AddOption(const CmdLineArgParserRef& parser,
395 const std::string& optionName,
396 const std::string& helpString,
397 bool stopParsing=false);
398
399 void AddOption(const CmdLineArgParserRef& parser,
400 const std::vector<std::string>& optionNames,
401 const std::string& helpString,
402 bool stopParsing=false);
403
405 const std::string& argumentName,
406 const std::string& helpString);
407
409
410 std::string GetHelp(size_t indent=2) const;
411 };
412
413 extern OSMSCOUT_API bool ParseBoolArgument(int argc,
414 char* argv[], // NOLINT
415 int& currentIndex,
416 bool& value);
417
418 extern OSMSCOUT_API bool ParseStringArgument(int argc,
419 char* argv[], // NOLINT
420 int& currentIndex,
421 std::string& value);
422
423 extern OSMSCOUT_API bool ParseSizeTArgument(int argc,
424 char* argv[], // NOLINT
425 int& currentIndex,
426 size_t& value);
427 extern OSMSCOUT_API bool ParseUInt32Argument(int argc,
428 char* argv[], // NOLINT
429 int& currentIndex,
430 uint32_t& value);
431}
432
433#endif
#define OSMSCOUT_API
Definition CoreImportExport.h:45
std::string GetOptionHint() const override
CmdLineParseResult Parse(CmdLineScanner &scanner) override
CmdLineAlternativeFlagArgParser(SetterFunction &&setter)
std::string GetPositionalHint(const std::string &positional) const override
std::function< void(const std::string &)> SetterFunction
Definition CmdLineParsing.h:116
Definition CmdLineParsing.h:74
virtual ~CmdLineArgParser()=default
void SetArgumentName(const std::string &argumentName)
virtual std::string GetOptionHint() const =0
std::string GetOptionName() const
std::string GetArgumentName() const
virtual CmdLineParseResult Parse(CmdLineScanner &scanner)=0
void SetOptionName(const std::string &optionName)
virtual std::string GetPositionalHint(const std::string &positional) const =0
std::string GetPositionalHint(const std::string &positional) const override
std::string GetOptionHint() const override
std::function< void(const bool &)> SetterFunction
Definition CmdLineParsing.h:134
CmdLineBoolArgParser(SetterFunction &&setter)
CmdLineParseResult Parse(CmdLineScanner &scanner) override
CmdLineParseResult Parse(CmdLineScanner &scanner) override
CmdLineFlagArgParser(SetterFunction &&setter)
std::string GetOptionHint() const override
std::string GetPositionalHint(const std::string &positional) const override
std::function< void(const bool &)> SetterFunction
Definition CmdLineParsing.h:99
std::string GetOptionHint() const override
CmdLineParseResult Parse(CmdLineScanner &scanner) override
std::string GetPositionalHint(const std::string &positional) const override
CmdLineGeoCoordArgParser(SetterFunction &&setter)
std::function< void(const GeoCoord &)> SetterFunction
Definition CmdLineParsing.h:229
std::function< void(const N &)> SetterFunction
Definition CmdLineParsing.h:186
std::string GetPositionalHint(const std::string &positional) const override
Definition CmdLineParsing.h:203
std::string GetOptionHint() const override
Definition CmdLineParsing.h:198
CmdLineParseResult Parse(CmdLineScanner &scanner) override
Definition CmdLineParsing.h:208
CmdLineNumberArgParser(SetterFunction &&setter)
Definition CmdLineParsing.h:192
Definition CmdLineParsing.h:57
CmdLineParseResult(const std::string &errorDescription)
std::string GetErrorDescription() const
void AddOption(const CmdLineArgParserRef &parser, const std::vector< std::string > &optionNames, const std::string &helpString, bool stopParsing=false)
std::string GetHelp(size_t indent=2) const
void AddOption(const CmdLineArgParserRef &parser, const std::string &optionName, const std::string &helpString, bool stopParsing=false)
CmdLineParseResult Parse()
CmdLineParser(const std::string &appName, const std::vector< std::string > &arguments)
void AddPositional(const CmdLineArgParserRef &parser, const std::string &argumentName, const std::string &helpString)
CmdLineParser(const std::string &appName, int argc, char *argv[])
Definition CmdLineParsing.h:39
CmdLineScanner(const std::vector< std::string > &arguments)
std::string GetCurrentArg() const
std::string PeakNextArg() const
CmdLineScanner(int argc, char *argv[])
std::string GetOptionHint() const override
CmdLineStringArgParser(SetterFunction &&setter)
CmdLineParseResult Parse(CmdLineScanner &scanner) override
std::function< void(const std::string &)> SetterFunction
Definition CmdLineParsing.h:151
std::string GetPositionalHint(const std::string &positional) const override
std::string GetPositionalHint(const std::string &positional) const override
std::string GetOptionHint() const override
CmdLineParseResult Parse(CmdLineScanner &scanner) override
CmdLineStringListArgParser(AppendFunction &&appender)
std::function< void(const std::string &)> AppendFunction
Definition CmdLineParsing.h:168
bool StringToNumber(const std::string &string, N &number, size_t base=10)
Definition String.h:295
Definition Area.h:39
std::shared_ptr< CmdLineArgParser > CmdLineArgParserRef
Definition CmdLineParsing.h:94
CmdLineArgParserRef CmdLineBoolOption(Args &&...args)
Definition CmdLineParsing.h:256
CmdLineArgParserRef CmdLineFlag(Args &&...args)
Definition CmdLineParsing.h:244
CmdLineArgParserRef CmdLineSizeTOption(Args &&...args)
Definition CmdLineParsing.h:304
CmdLineArgParserRef CmdLineStringOption(Args &&...args)
Definition CmdLineParsing.h:262
CmdLineArgParserRef CmdLineDoubleOption(Args &&...args)
Definition CmdLineParsing.h:310
CmdLineArgParserRef CmdLineAlternativeFlag(Args &&...args)
Definition CmdLineParsing.h:250
OSMSCOUT_API bool ParseStringArgument(int argc, char *argv[], int &currentIndex, std::string &value)
CmdLineArgParserRef CmdLineStringListOption(Args &&...args)
Definition CmdLineParsing.h:268
CmdLineArgParserRef CmdLineUIntOption(Args &&...args)
Definition CmdLineParsing.h:286
OSMSCOUT_API bool ParseSizeTArgument(int argc, char *argv[], int &currentIndex, size_t &value)
CmdLineArgParserRef CmdLineNumberOption(Args &&...args)
Definition CmdLineParsing.h:274
CmdLineArgParserRef CmdLineLongOption(Args &&...args)
Definition CmdLineParsing.h:292
CmdLineArgParserRef CmdLineIntOption(Args &&...args)
Definition CmdLineParsing.h:280
OSMSCOUT_API bool ParseUInt32Argument(int argc, char *argv[], int &currentIndex, uint32_t &value)
OSMSCOUT_API bool ParseBoolArgument(int argc, char *argv[], int &currentIndex, bool &value)
CmdLineArgParserRef CmdLineULongOption(Args &&...args)
Definition CmdLineParsing.h:298
CmdLineArgParserRef CmdLineGeoCoordOption(Args &&...args)
Definition CmdLineParsing.h:316