6#include "lix/libutil/json-fwd.hh"
22enum class HashType : char;
39 virtual bool forceImpureByDefault() {
return false; }
44 virtual std::string
doc() {
return ""; }
55 static const size_t ArityAny = std::numeric_limits<size_t>::max();
67 std::function<void(std::vector<std::string>)> fun;
72 Handler(std::function<
void(std::vector<std::string>)> && fun)
77 Handler(std::function<
void()> && handler)
78 : fun([handler{std::move(handler)}](std::vector<std::string>) { handler(); })
82 Handler(std::function<
void(std::string)> && handler)
83 : fun([handler{std::move(handler)}](std::vector<std::string> ss) {
84 handler(std::move(ss[0]));
89 Handler(std::function<
void(std::string, std::string)> && handler)
90 : fun([handler{std::move(handler)}](std::vector<std::string> ss) {
91 handler(std::move(ss[0]), std::move(ss[1]));
96 Handler(std::vector<std::string> * dest)
97 : fun([=](std::vector<std::string> ss) { *dest = ss; })
101 Handler(std::string * dest)
102 : fun([=](std::vector<std::string> ss) { *dest = ss[0]; })
106 Handler(std::optional<std::string> * dest)
107 : fun([=](std::vector<std::string> ss) { *dest = ss[0]; })
112 Handler(T * dest,
const T & val)
113 : fun([=](std::vector<std::string> ss) { *dest = val; })
119 : fun([=](std::vector<std::string> ss) {
126 Handler(std::optional<I> * dest)
127 : fun([=](std::vector<std::string> ss) {
161 typedef std::shared_ptr<Flag> ptr;
163 std::string longName;
164 std::set<std::string> aliases;
166 std::string description;
167 std::string category;
172 std::optional<ExperimentalFeature> experimentalFeature;
174 static Flag mkHashTypeFlag(std::string && longName, HashType * ht);
175 static Flag mkHashTypeOptFlag(std::string && longName, std::optional<HashType> * oht);
196 virtual bool processFlag(Strings::iterator & pos, Strings::iterator end);
207 bool optional =
false;
246 virtual bool processArgs(
const Strings & args,
bool finish);
248 virtual Strings::iterator rewriteArgs(Strings & args, Strings::iterator pos)
253 std::set<std::string> hiddenCategories;
264 virtual std::optional<std::reference_wrapper<RootArgs>>
asRootArgs() {
270 void addFlag(Flag && flag);
272 void removeFlag(
const std::string & longName);
274 void expectArgs(ExpectedArg && arg)
282 void expectArg(
const std::string & label, std::string * dest,
bool optional =
false)
286 .optional = optional,
294 void expectArgs(
const std::string & label, std::vector<std::string> * dest)
306 virtual JSON toJSON();
334 friend class MultiCommand;
343 typedef int Category;
345 static constexpr Category catDefault = 0;
346 static constexpr Category catCustom = 1000;
348 virtual std::optional<ExperimentalFeature> experimentalFeature ();
350 virtual Category category() {
return catDefault; }
353using CommandMap = std::map<std::string, std::function<ref<Command>(AsyncIoRoot &)>>;
363 Strings customCommandSearchPaths;
364 bool isExternalSubcommand;
366 std::map<Command::Category, std::string> categories;
371 std::optional<std::pair<std::string, ref<Command>>>
command;
373 MultiCommand(
const CommandMap & commands,
bool allowExternal =
false);
375 bool processFlag(Strings::iterator & pos, Strings::iterator end)
override;
377 bool processArgs(
const Strings & args,
bool finish)
override;
379 JSON toJSON()
override;
388 Strings externalArgv;
391 std::filesystem::path absoluteBinaryPath;
392 static constexpr std::string_view lixExternalPrefix =
"lix-";
394 ExternalCommand(
AsyncIoRoot & aio, std::filesystem::path absoluteBinaryPath);
396 virtual bool processFlag(Strings::iterator & pos, Strings::iterator end)
override;
397 virtual bool processArgs(
const Strings & args,
bool finish)
override;
398 virtual void run()
override;
399 virtual std::optional<ExperimentalFeature> experimentalFeature ()
override {
400 return Xp::LixCustomSubCommands;
404 virtual Category category()
override {
return catCustom; }
406 virtual AsyncIoRoot & aio()
override {
return aio_; }
414std::optional<ref<Command>> searchForCustomSubcommand(
const std::string_view & command,
const Strings & searchPaths);
420Strings searchForAllAvailableCustomSubcommands(
const std::string_view & prefix,
const Strings & searchPaths);
423 std::string completion;
424 std::string description;
426 bool operator<(
const Completion & other)
const;
461 virtual void add(std::string completion, std::string description =
"") = 0;
virtual void setType(Type type)=0
virtual void add(std::string completion, std::string description="")=0
Type
Definition args.hh:445
MultiCommand * parent
Definition args.hh:319
virtual std::optional< std::reference_wrapper< RootArgs > > asRootArgs()
Definition args.hh:264
virtual bool processFlag(Strings::iterator &pos, Strings::iterator end)
Definition args.cc:146
std::list< ExpectedArg > expectedArgs
Definition args.hh:221
void CompleterFun(AddCompletions &, size_t, std::string_view)
Definition args.hh:143
std::list< ExpectedArg > processedArgs
Definition args.hh:233
virtual std::string description()
Definition args.hh:37
std::function< CompleterFun > CompleterClosure
Definition args.hh:151
RootArgs & getRoot()
Definition args.cc:61
void expectArgs(const std::string &label, std::vector< std::string > *dest)
Definition args.hh:294
virtual std::string doc()
Definition args.hh:44
virtual void initialFlagsProcessed()
Definition args.hh:259
std::map< char, Flag::ptr > shortFlags
Definition args.hh:188
virtual bool processArgs(const Strings &args, bool finish)
Definition args.cc:221
std::map< std::string, Flag::ptr > longFlags
Definition args.hh:182
void expectArg(const std::string &label, std::string *dest, bool optional=false)
Definition args.hh:282
static const size_t ArityAny
Definition args.hh:55
virtual void run() override
Definition args.cc:592
virtual bool processArgs(const Strings &args, bool finish) override
Definition args.cc:583
virtual bool processFlag(Strings::iterator &pos, Strings::iterator end) override
Definition args.cc:574
bool processFlag(Strings::iterator &pos, Strings::iterator end) override
Definition args.cc:531
std::optional< std::pair< std::string, ref< Command > > > command
Definition args.hh:371
bool processArgs(const Strings &args, bool finish) override
Definition args.cc:538
@ Normal
Definition sqlite.hh:24
N string2IntWithUnitPrefix(std::string_view s)
Definition strings.hh:157