Decentralised Art Server
High-performance C++ backend that exposes HTML interface and a secure REST API for managing Performative Transactions entities
 
Loading...
Searching...
No Matches
cmd.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <string>
4#include <format>
5#include <vector>
6#include <optional>
7#include <filesystem>
8
9#include <absl/container/flat_hash_map.h>
10#include <spdlog/spdlog.h>
11
12namespace dcn::cmd
13{
15 {
16 enum class NArgs
17 {
18 Zero,
19 One,
20 Many
21 };
22
23 enum class Type
24 {
25 Unknown = 0,
26 Int,
27 Uint,
28 String,
29 Bool,
30 Float,
31 Path
32 };
33
34 const std::string name;
35 const std::string desc;
36
39 };
40
42 {
43
44 public:
45 std::string constructHelpMessage() const;
46
47 template<class T>
48 void addArg(std::string name, std::string desc);
49
50 template<class T>
51 void addArg(std::string name, std::string desc, T default_value)
52 {
53 addArg<T>(std::move(name), std::move(desc));
54 _values[name] = std::move(default_value);
55 }
56
57 void parse(int argc, char** argv);
58
59 template<class T>
60 std::optional<T> getArg(std::string_view name)
61 {
62 const auto it = _values.find(name);
63 if(it == _values.end())
64 {
65 return std::nullopt;
66 }
67
68 if(std::holds_alternative<T>(it->second) == false)
69 {
70 spdlog::error("Type mismatch for argument \"{}\"", name);
71 return std::nullopt;
72 }
73
74 return std::get<T>(it->second);
75 }
76
77
78 private:
79 void _addArgDef(std::string name, CommandLineArgDef::NArgs nargs, CommandLineArgDef::Type type, std::string desc);
80
81
82
83 std::vector<CommandLineArgDef> _args;
84
85 absl::flat_hash_map<std::string, std::variant<
86 bool,
87
88 int,
89 std::vector<int>,
90
91 unsigned int,
92 std::vector<unsigned int>,
93
94 std::string,
95 std::vector<std::string>,
96
97 float,
98 std::vector<float>,
99
100 std::filesystem::path,
101 std::vector<std::filesystem::path>>> _values;
102 };
103
104 template<>
105 void ArgParser::addArg<bool>(std::string name, std::string desc);
106
107 template<>
108 void ArgParser::addArg<int>(std::string name, std::string desc);
109
110 template<>
111 void ArgParser::addArg<std::vector<int>>(std::string name, std::string desc);
112
113 template<>
114 void ArgParser::addArg<unsigned int>(std::string name, std::string desc);
115
116 template<>
117 void ArgParser::addArg<std::vector<unsigned int>>(std::string name, std::string desc);
118
119 template<>
120 void ArgParser::addArg<std::string>(std::string name, std::string desc);
121
122 template<>
123 void ArgParser::addArg<std::vector<std::string>>(std::string name, std::string desc);
124
125 template<>
126 void ArgParser::addArg<float>(std::string name, std::string desc);
127
128 template<>
129 void ArgParser::addArg<std::vector<float>>(std::string name, std::string desc);
130
131 template<>
132 void ArgParser::addArg<std::filesystem::path>(std::string name, std::string desc);
133
134 template<>
135 void ArgParser::addArg<std::vector<std::filesystem::path>>(std::string name, std::string desc);
136
137}
Definition cmd.hpp:42
void addArg(std::string name, std::string desc)
std::string constructHelpMessage() const
Definition cmd.cpp:333
std::optional< T > getArg(std::string_view name)
Definition cmd.hpp:60
void addArg(std::string name, std::string desc, T default_value)
Definition cmd.hpp:51
std::string name
Definition ingestion.cpp:29
Definition cmd.hpp:13
Definition cmd.hpp:15
NArgs nargs
Definition cmd.hpp:37
Type type
Definition cmd.hpp:38
Type
Definition cmd.hpp:24
const std::string desc
Definition cmd.hpp:35
const std::string name
Definition cmd.hpp:34
NArgs
Definition cmd.hpp:17