#pragma once #include "last_getopt_opts.h" #include "last_getopt_parser.h" namespace NLastGetopt { /** * NLastGetopt::TOptParseResult contains all arguments for exactly one TOpt, * that have been fetched during parsing * * The class is a wraper over a vector of nil-terminated strings. */ class TOptParseResult { public: typedef TVector TValues; public: TOptParseResult(const TOpt* opt = nullptr) : Opt_(opt) { } public: const TOpt& Opt() const { return *Opt_; } const TOpt* OptPtr() const { return Opt_; } const TValues& Values() const { return Values_; } bool Empty() const { return Values().empty(); } size_t Count() const { return Values_.size(); } void AddValue(const char* val) { if (nullptr != val) Values_.push_back(val); } const char* DefVal(const char* def = nullptr) const { return Opt().HasDefaultValue() ? Opt().GetDefaultValue().c_str() : def; } const char* Front(const char* def = nullptr) const { return Empty() ? DefVal(def) : Values().front(); } const char* Back(const char* def = nullptr) const { return Empty() ? DefVal(def) : Values().back(); } private: const TOpt* Opt_; TValues Values_; }; /** * NLastGetopt::TOptsParseResult contains result of parsing argc,argv be parser. * * In most common case constructed by argc,argv pair and rules (TOpts). * The instance being constructed validates rules and performs parsing, stores result for futher access. * * If error during parsing occures, the program aborts with exit code 1. * Note, that if PERMUTE mode is on, then data, pointed by argv can be changed. */ class TOptsParseResult { private: THolder Parser_; //The instance of parser. // XXX: make argc, argv typedef TVector TdVec; TdVec Opts_; //Parsing result for all options, that have been explicitly defined in argc/argv TdVec OptsDef_; //Parsing result for options, that have been defined by default values only private: TOptParseResult& OptParseResult(); /** * Searchs for object in given container * * @param vec container * @param opt ptr for required object * * @retunr ptr on corresponding TOptParseResult */ static const TOptParseResult* FindParseResult(const TdVec& vec, const TOpt* opt); protected: /** * Performs parsing of comand line arguments. */ void Init(const TOpts* options, int argc, const char** argv); TOptsParseResult() = default; public: /** * The action in case of parser failure. * Allows to asjust behavior in derived classes. * By default prints error string and aborts the program */ virtual void HandleError() const; /** * Constructs object by parsing arguments with given rules * * @param options ptr on parsing rules * @param argc * @param argv */ TOptsParseResult(const TOpts* options, int argc, const char* argv[]) { Init(options, argc, argv); } /** * Constructs object by parsing arguments with given rules * * @param options ptr on parsing rules * @param argc * @param argv */ TOptsParseResult(const TOpts* options, int argc, char* argv[]) { Init(options, argc, const_cast(argv)); } virtual ~TOptsParseResult() = default; /** * Search for TOptParseResult that corresponds to given option (TOpt) * * @param opt ptr on required object * @param includeDefault search in results obtained from default values * * @return ptr on result */ const TOptParseResult* FindOptParseResult(const TOpt* opt, bool includeDefault = false) const; /** * Search for TOptParseResult that corresponds to given long name * * @param name long name of required object * @param includeDefault search in results obtained from default values * * @return ptr on result */ const TOptParseResult* FindLongOptParseResult(const TString& name, bool includeDefault = false) const; /** * Search for TOptParseResult that corresponds to given short name * * @param c short name of required object * @param includeDefault search in results obtained from default values * * @return ptr on result */ const TOptParseResult* FindCharOptParseResult(char c, bool includeDefault = false) const; /** * @return argv[0] */ TString GetProgramName() const; /** * Print usage string. */ void PrintUsage(IOutputStream& os = Cout) const; /** * @return position in [premuted argv] of the first free argument */ size_t GetFreeArgsPos() const; /** * @return number of fetched free arguments */ size_t GetFreeArgCount() const; /** * @return all fetched free arguments */ TVector GetFreeArgs() const; /** * @return true if given option exist in results of parsing * * @param opt ptr on required object * @param includeDefault search in results obtained from default values * */ bool Has(const TOpt* opt, bool includeDefault = false) const; /** * @return nil terminated string on the last fetched argument of givne option * * @param opt ptr on required object * @param includeDefault search in results obtained from default values */ const char* Get(const TOpt* opt, bool includeDefault = true) const; /** * @return nil terminated string on the last fetched argument of givne option * if option haven't been fetched, given defaultValue will be returned * * @param opt ptr on required object * @param defaultValue */ const char* GetOrElse(const TOpt* opt, const char* defaultValue) const; /** * @return true if given option exist in results of parsing * * @param name long name of required object * @param includeDefault search in results obtained from default values * */ bool Has(const TString& name, bool includeDefault = false) const; /** * @return nil terminated string on the last fetched argument of givne option * * @param name long name of required object * @param includeDefault search in results obtained from default values */ const char* Get(const TString& name, bool includeDefault = true) const; /** * @return nil terminated string on the last fetched argument of givne option * if option haven't been fetched, given defaultValue will be returned * * @param name long name of required object * @param defaultValue */ const char* GetOrElse(const TString& name, const char* defaultValue) const; /** * @return true if given option exist in results of parsing * * @param c short name of required object * @param includeDefault search in results obtained from default values * */ bool Has(char name, bool includeDefault = false) const; /** * @return nil terminated string on the last fetched argument of givne option * * @param c short name of required object * @param includeDefault search in results obtained from default values */ const char* Get(char name, bool includeDefault = true) const; /** * @return nil terminated string on the last fetched argument of givne option * if option haven't been fetched, given defaultValue will be returned * * @param c short name of required object * @param defaultValue */ const char* GetOrElse(char name, const char* defaultValue) const; /** * for givne option return parsed value of the last fetched argument * if option haven't been fetched, HandleError action is called * * @param opt required option (one of: ptr, short name, long name). * * @return FromString(last feteched argument) */ template T Get(const TKey opt) const { const char* value = Get(opt); try { return NPrivate::OptFromString(value, opt); } catch (...) { HandleError(); throw; } } /** * for givne option return parsed value of the last fetched argument * if option haven't been fetched, given defaultValue will be returned * * @param opt required option (one of: ptr, short name, long name). * @param defaultValue * * @return FromString(last feteched argument) */ template T GetOrElse(const TKey opt, const T& defaultValue) const { if (Has(opt)) return Get(opt); else return defaultValue; } /** * @return returns the argv with which the parser was started */ const char** GetSourceArgv() { return Parser_ ? Parser_->Argv_ : nullptr; } /** * @returns the argc with which the parser was started */ size_t GetSourceArgc() { return Parser_ ? Parser_->Argc_ : 0; } }; /** * NLastGetopt::TOptsParseResultException contains result of parsing argc,argv be parser. * * Unlike TOptsParseResult, if error during parsing occures, an exception is thrown. * */ class TOptsParseResultException: public TOptsParseResult { public: TOptsParseResultException(const TOpts* options, int argc, const char* argv[]) { Init(options, argc, argv); } TOptsParseResultException(const TOpts* options, int argc, char* argv[]) { Init(options, argc, const_cast(argv)); } virtual ~TOptsParseResultException() = default; void HandleError() const override; protected: TOptsParseResultException() = default; }; }