X-Git-Url: https://git.dlugolecki.net.pl/?p=command.git;a=blobdiff_plain;f=include%2Fargument.h;h=2cd3c300f970a8d2e205de7685a6f10fd9ad241d;hp=6a292b4f6b63135945f8d8a9619b427c4b5de450;hb=ae6743a2a2c69b7a927f64ff1d3abf38a5e7d4bc;hpb=638b210134daa5d4ecd207e003241a4edb7234dc diff --git a/include/argument.h b/include/argument.h index 6a292b4..2cd3c30 100644 --- a/include/argument.h +++ b/include/argument.h @@ -2,46 +2,91 @@ #define __COMMAND_ARGUMENT_H #include +#include +#include +#include -#include +#include "parameter.h" +#include "callable.h" namespace command { /** * Class responsible for handling commandline arguments. - * Arguments are required non-named parameters for program. + * Arguments are non-named parameters of program. * * Example: - * ./myprog ARGUMENT + * - ./myprog ARGUMENT + * - ./myprog /path/to/file + * - ./myprog "some argument" */ - template - class Argument : public Descriptive { - public: - typedef void (*)(ArgumentType) FunctionType; - + template + class Argument : public Parameter, public Callable { protected: - /** - * Function handling user Arguments - */ - FunctionType function; - + ParameterType value; public: + typedef class Argument Type; + /** * Default constructor. * * @param description Description of current Argument * @param function Function used to handle current Argument. */ - Argument(std::string description, FunctionType function) - : Descriptive(description), function(function) { + Argument(const std::string & description, void (*function)(ParameterType)) + : Parameter(description), Callable(function) { + } + + Argument(const std::string & description, std::function function) + : Parameter(description), Callable(function) { } /** - * Executes command binded with argument * - * @param value Value passed to program argument */ - void run(ArgumentType value) { - this->function(value); + virtual ~Argument() { } + + /** + * \inheritdoc + */ + virtual void handle() { + this->call(value); + this->used = true; + } + + /** + * Method used for checking if Argument understands user value. + * If so current Argument is flagged as used and no more checks against + * it will be done in future. + * + * \attention If conversion from passed value to ParameterType is + * impossible, it is ignored. It means that it is not understanded by + * Argument. + * + * @param argv command line value against which test will be made. + * + * @return If passed argv is succesfully converted to ParameterType, + * returns true and Argument is set as used one. If there was an error + * during conversion, method returns false and can be used to check + * against next value. + */ + virtual bool understand(const std::string & argv) { + std::stringstream ss; + + ss << std::fixed << argv; + ss >> value; + + if (!ss.fail()) { + return true; + } + + return false; + } + + /** + * \inheritdoc + */ + virtual unsigned int valuePosition(const std::string & ) { + return 0; } }; }