diff options
author | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-02-09 21:28:29 +0100 |
---|---|---|
committer | Eelco Dolstra <eelco.dolstra@logicblox.com> | 2016-02-09 21:28:29 +0100 |
commit | cd2196b08981a96cf607ad4a8f2f0dfa8cdf2add (patch) | |
tree | b8f213b8790dc55812dae9fd1403bb352ccad0e2 /src/nix/command.hh | |
parent | 0db9e6cd1af299f7d65e0b99019f0ccdbb1aaf3f (diff) |
Start of new Nix command-line interface
Diffstat (limited to 'src/nix/command.hh')
-rw-r--r-- | src/nix/command.hh | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/src/nix/command.hh b/src/nix/command.hh new file mode 100644 index 000000000..a84721ccf --- /dev/null +++ b/src/nix/command.hh @@ -0,0 +1,59 @@ +#pragma once + +#include "args.hh" + +namespace nix { + +/* A command is an argument parser that can be executed by calling its + run() method. */ +struct Command : virtual Args +{ + virtual std::string name() = 0; + virtual void prepare() { }; + virtual void run() = 0; +}; + +class Store; + +/* A command that require a Nix store. */ +struct StoreCommand : virtual Command +{ + bool reserveSpace; + StoreCommand(bool reserveSpace = true) + : reserveSpace(reserveSpace) { }; + void run() override; + virtual void run(ref<Store>) = 0; +}; + +typedef std::map<std::string, ref<Command>> Commands; + +/* An argument parser that supports multiple subcommands, + i.e. ‘<command> <subcommand>’. */ +struct MultiCommand : virtual Args +{ + Commands commands; + + std::shared_ptr<Command> command; + + MultiCommand(const Commands & commands); + + void printHelp(const string & programName, std::ostream & out) override; + + bool processFlag(Strings::iterator & pos, Strings::iterator end) override; + + bool processArgs(const Strings & args, bool finish) override; +}; + +/* A helper class for registering commands globally. */ +struct RegisterCommand +{ + static Commands * commands; + + RegisterCommand(ref<Command> command) + { + if (!commands) commands = new Commands; + commands->emplace(command->name(), command); + } +}; + +} |