diff --git a/lib/api.dart b/lib/api.dart index 436357bf..0be04b53 100644 --- a/lib/api.dart +++ b/lib/api.dart @@ -27,6 +27,7 @@ export 'package:mineral/src/api/common/commands/command_helper.dart'; export 'package:mineral/src/api/common/commands/command_option.dart'; export 'package:mineral/src/api/common/commands/command_option_type.dart'; export 'package:mineral/src/api/common/commands/command_type.dart'; +export 'package:mineral/src/api/common/commands/sub_command_declaration.dart'; export 'package:mineral/src/api/common/components/action_row.dart'; export 'package:mineral/src/api/common/components/attached_file.dart'; // Commons diff --git a/lib/src/api/common/commands/builder/command_declaration_builder.dart b/lib/src/api/common/commands/builder/command_declaration_builder.dart index 3dd739b4..b34e463e 100644 --- a/lib/src/api/common/commands/builder/command_declaration_builder.dart +++ b/lib/src/api/common/commands/builder/command_declaration_builder.dart @@ -5,6 +5,7 @@ import 'package:mineral/src/api/common/commands/command_context_type.dart'; import 'package:mineral/src/api/common/commands/command_helper.dart'; import 'package:mineral/src/api/common/commands/command_option.dart'; import 'package:mineral/src/api/common/commands/command_type.dart'; +import 'package:mineral/src/api/common/commands/sub_command_declaration.dart'; import 'package:mineral/src/domains/commands/command_builder.dart'; import 'package:mineral/src/infrastructure/io/exceptions/missing_method_exception.dart'; import 'package:mineral/src/infrastructure/io/exceptions/missing_property_exception.dart'; @@ -71,6 +72,18 @@ final class CommandDeclarationBuilder implements CommandBuilder { return this; } + CommandDeclarationBuilder registerSubCommand(Function subCommandFactory) { + final instance = subCommandFactory(); + + if (instance is! SubCommandDeclaration) { + throw Exception('Factory must return a SubCommandDeclaration instance'); + } + + final builder = instance.build(); + subCommands.add(builder); + return this; + } + CommandDeclarationBuilder createGroup(Function(CommandGroupBuilder) group) { final builder = CommandGroupBuilder(); group(builder); diff --git a/lib/src/api/common/commands/sub_command_declaration.dart b/lib/src/api/common/commands/sub_command_declaration.dart new file mode 100644 index 00000000..8d3f1e7a --- /dev/null +++ b/lib/src/api/common/commands/sub_command_declaration.dart @@ -0,0 +1,6 @@ +import 'package:mineral/src/api/common/commands/builder/sub_command_builder.dart'; +import 'package:mineral/src/domains/common/utils/listenable.dart'; + +abstract interface class SubCommandDeclaration implements Listenable { + SubCommandBuilder build(); +}