dew/packages/kanban/lib/src/commands/create_command.dart

89 lines
2.5 KiB
Dart

import 'package:dew_core/dew_core.dart';
import 'package:file/file.dart';
import 'package:file/local.dart';
import '../kanban_config.dart';
import '../ticket_store.dart';
class CreateCommand extends DewCommand with DewToolCommand {
final FileSystem _fs;
CreateCommand({this._fs = const LocalFileSystem()}) {
argParser
..addOption('title', abbr: 't', mandatory: true, help: 'Ticket title.')
..addOption(
'type',
mandatory: true,
help: 'Ticket type (e.g. task, bug).',
)
..addOption(
'column',
abbr: 'c',
help: 'Initial column. Defaults to the first configured column.',
)
..addOption('body', abbr: 'b', help: 'Ticket description.')
..addMultiOption(
'milestone',
help: 'Milestone(s) to assign (repeatable).',
)
..addMultiOption('label', help: 'Label(s) to assign (repeatable).');
}
@override
final String name = 'create';
@override
final String description = 'Create a new kanban ticket.';
@override
final String toolName = 'kanban_create_ticket';
@override
Future<String> callAsTool(Map<String, dynamic> args) async {
final context = await ProjectContext.find(fs: _fs);
final config = context.config.kanban;
final title = '${args['title']}';
final typeId = '${args['type']}';
final columnArg = args['column'] != null ? '${args['column']}' : null;
final body = args['body'] != null ? '${args['body']}' : '';
final milestones = _toStringList(args['milestone']);
final labels = _toStringList(args['label']);
if (!config.ticketTypes.any((t) => t.id == typeId)) {
throw ArgumentError(
'Unknown type "$typeId". '
'Valid: ${config.ticketTypes.map((t) => t.id).join(', ')}',
);
}
final column = columnArg ?? config.columns.first.id;
if (!config.columns.any((c) => c.id == column)) {
throw ArgumentError(
'Unknown column "$column". '
'Valid: ${config.columns.map((c) => c.id).join(', ')}',
);
}
final store = TicketStore(
kanbanDir: context.dirs.kanban,
prefix: config.prefix,
fs: context.fs,
);
final ticket = await store.create(
title: title,
type: typeId,
column: column,
body: body,
milestones: milestones,
labels: labels,
);
return 'Created ${ticket.id}: ${ticket.title}';
}
static List<String> _toStringList(dynamic value) {
if (value is List) return value.cast<String>();
if (value is String && value.isNotEmpty) return [value];
return const [];
}
}