2 * Copyright 2013, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
6 * Ingo Weinhold <ingo_weinhold@gmx.de>
12 #include <ObjectList.h>
15 #include "CommonOptions.h"
20 Command(const BString
& name
,
21 const BString
& shortUsage
,
22 const BString
& longUsage
,
23 const BString
& category
);
26 void Init(const char* programName
);
28 const BString
& Name() const { return fName
; }
29 const BString
& ShortUsage() const { return fShortUsage
; }
30 const BString
& LongUsage() const { return fLongUsage
; }
31 const BString
& Category() const { return fCategory
; }
33 void PrintUsage(bool error
) const;
34 void PrintUsageAndExit(bool error
) const;
36 virtual int Execute(int argc
, const char* const* argv
) = 0;
39 CommonOptions fCommonOptions
;
49 typedef BObjectList
<Command
> CommandList
;
52 class CommandManager
{
54 static CommandManager
* Default();
56 void RegisterCommand(Command
* command
);
57 void InitCommands(const char* programName
);
59 const CommandList
& Commands() const
61 void GetCommands(const char* prefix
,
62 CommandList
& _commands
);
63 void GetCommandsForCategory(const char* category
,
64 CommandList
& _commands
);
70 CommandList fCommands
;
74 template<typename CommandType
>
75 struct CommandRegistrar
{
78 CommandManager::Default()->RegisterCommand(new CommandType
);
83 #define DEFINE_COMMAND(className, name, shortUsage, longUsage, category) \
84 struct className : Command { \
87 Command(name, shortUsage, longUsage, category) \
91 virtual int Execute(int argc, const char* const* argv); \
93 static CommandRegistrar<className> sRegister##className;