From abe0a08b2ebe6883b09b10c1dd784f8439118de7 Mon Sep 17 00:00:00 2001 From: KamaSK Date: Wed, 28 May 2025 16:38:12 +0300 Subject: [PATCH] =?UTF-8?q?=D0=A2=D0=B5=D0=BF=D0=B5=D1=80=D1=8C=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B8=D0=BB=D0=BE=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7?= =?UTF-8?q?=D0=B0=D0=BF=D1=83=D1=81=D0=BA=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20?= =?UTF-8?q?=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20CLI=20Engine,=20=D1=87=D1=82?= =?UTF-8?q?=D0=BE=20=D1=83=D0=BB=D1=83=D1=87=D1=88=D0=B0=D0=B5=D1=82=20?= =?UTF-8?q?=D0=B2=D0=B7=D0=B0=D0=B8=D0=BC=D0=BE=D0=B4=D0=B5=D0=B9=D1=81?= =?UTF-8?q?=D1=82=D0=B2=D0=B8=D0=B5=20=D1=81=20=D0=BF=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=BC.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/ru/kamask/pet/todo/TodoApp.java | 22 ++---- .../ru/kamask/pet/todo/cli/CliEngine.java | 71 +++++++++++++++++++ .../java/ru/kamask/pet/todo/cli/Command.java | 15 ++++ .../ru/kamask/pet/todo/cli/CreateCommand.java | 28 ++++++++ 4 files changed, 120 insertions(+), 16 deletions(-) create mode 100644 todo/src/main/java/ru/kamask/pet/todo/cli/CliEngine.java create mode 100644 todo/src/main/java/ru/kamask/pet/todo/cli/Command.java create mode 100644 todo/src/main/java/ru/kamask/pet/todo/cli/CreateCommand.java diff --git a/todo/src/main/java/ru/kamask/pet/todo/TodoApp.java b/todo/src/main/java/ru/kamask/pet/todo/TodoApp.java index 129b22e..63c6982 100644 --- a/todo/src/main/java/ru/kamask/pet/todo/TodoApp.java +++ b/todo/src/main/java/ru/kamask/pet/todo/TodoApp.java @@ -1,26 +1,16 @@ package ru.kamask.pet.todo; -import ru.kamask.pet.todo.model.SimpleTask; +import java.io.IOException; + +import ru.kamask.pet.todo.cli.CliEngine; import ru.kamask.pet.todo.repo.InMemoryTaskRepository; import ru.kamask.pet.todo.service.TaskService; public class TodoApp { - - public static void main(String[] args) { + public static void main(String[] args) throws IOException { var service = new TaskService(new InMemoryTaskRepository()); - - service.create("Задача номер один"); - service.create("Задача номер два"); - service.create("Задача номер три"); - service.create("Задача номер четыре"); - - System.out.println(service.list()); - - service.complete(2); - service.getById(2).ifPresent(task -> System.out.println(((SimpleTask) task).data())); - - service.remove(3); - System.out.println(service.list()); + var cli = new CliEngine(service); + cli.start(); } } diff --git a/todo/src/main/java/ru/kamask/pet/todo/cli/CliEngine.java b/todo/src/main/java/ru/kamask/pet/todo/cli/CliEngine.java new file mode 100644 index 0000000..c179fa3 --- /dev/null +++ b/todo/src/main/java/ru/kamask/pet/todo/cli/CliEngine.java @@ -0,0 +1,71 @@ +package ru.kamask.pet.todo.cli; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Optional; + +import ru.kamask.pet.todo.service.TaskService; + +public class CliEngine { + private HashMap registry = new HashMap<>(); + private TaskService service; + private BufferedReader reader; + + public CliEngine(TaskService service) { + this.service = service; + reader = new BufferedReader(new InputStreamReader(System.in)); + initializeCommands(); + } + + public void start() throws IOException { + System.out.println("\nДобро пожаловать в Список задач 2.0!"); + System.out.println("Введите help для просмтора доступных команд или exit для выхода."); + while (true) { + System.out.print("\ntodo> "); + var input = reader.readLine().trim(); + System.out.println(); + switch (input) { + case "help" -> handleHelp(); + case "exit" -> System.exit(0); + default -> handleCommand(input).ifPresentOrElse(System.out::println, () -> { + System.out.println("Не известная команда. Повторите ввод.\n"); + handleHelp(); + }); + } + } + } + + void registerCommand(Command command) { + registry.put(command.name(), command); + } + + void initializeCommands() { + registerCommand(new CreateCommand()); + } + + void handleHelp() { + var template = " %-30s // %s"; + System.out.println("Доступные команды:\n"); + registry.values().stream() + .map(handler -> String.format(template, handler.example(), handler.description())) + .forEach(System.out::println); + System.out.println(); + System.out.printf(template, "help", "Вот этот список команд\n"); + System.out.printf(template, "exit", "Выход, но лучше не надо)\n"); + + } + + Optional handleCommand(String input) { + var parts = input.split("\\s+"); + var command = parts[0]; + var args = Arrays.copyOfRange(parts, 1, parts.length); + + var handlerOpt = Optional.ofNullable(registry.get(command)); + if (handlerOpt.isPresent()) + return handlerOpt.get().handle(args, service); + return Optional.empty(); + } +} diff --git a/todo/src/main/java/ru/kamask/pet/todo/cli/Command.java b/todo/src/main/java/ru/kamask/pet/todo/cli/Command.java new file mode 100644 index 0000000..cb1e6b3 --- /dev/null +++ b/todo/src/main/java/ru/kamask/pet/todo/cli/Command.java @@ -0,0 +1,15 @@ +package ru.kamask.pet.todo.cli; + +import java.util.Optional; + +import ru.kamask.pet.todo.service.TaskService; + +public interface Command { + Optional handle(String[] args, TaskService service); + + String name(); + + String example(); + + String description(); +} diff --git a/todo/src/main/java/ru/kamask/pet/todo/cli/CreateCommand.java b/todo/src/main/java/ru/kamask/pet/todo/cli/CreateCommand.java new file mode 100644 index 0000000..5210c53 --- /dev/null +++ b/todo/src/main/java/ru/kamask/pet/todo/cli/CreateCommand.java @@ -0,0 +1,28 @@ +package ru.kamask.pet.todo.cli; + +import java.util.Optional; + +import ru.kamask.pet.todo.service.TaskService; + +public class CreateCommand implements Command { + @Override + public String name() { + return "create"; + } + + @Override + public Optional handle(String[] args, TaskService service) { + // TODO create new todo + return Optional.of("Добавление новой задачи"); + } + + @Override + public String example() { + return name() + " "; + } + + @Override + public String description() { + return "Добавление новой задачи"; + } +}