diff --git a/.gitignore b/.gitignore index 65a5a36..d82b4cb 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ todo/target/ .vscode/ +.lingma/ \ No newline at end of file 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 index dd39b15..8852465 100644 --- a/todo/src/main/java/ru/kamask/pet/todo/cli/CliEngine.java +++ b/todo/src/main/java/ru/kamask/pet/todo/cli/CliEngine.java @@ -46,6 +46,7 @@ public class CliEngine { registerCommand(new CreateCommand()); registerCommand(new ListCommand()); registerCommand(new CompleteCommand()); + registerCommand(new SearchCommand()); registerCommand(new DeleteCommand()); } diff --git a/todo/src/main/java/ru/kamask/pet/todo/cli/ListCommand.java b/todo/src/main/java/ru/kamask/pet/todo/cli/ListCommand.java index 102837c..80b2fc5 100644 --- a/todo/src/main/java/ru/kamask/pet/todo/cli/ListCommand.java +++ b/todo/src/main/java/ru/kamask/pet/todo/cli/ListCommand.java @@ -1,5 +1,6 @@ package ru.kamask.pet.todo.cli; +import java.util.List; import java.util.Optional; import ru.kamask.pet.todo.model.SimpleTask; @@ -17,18 +18,8 @@ public class ListCommand implements Command { if (args.length > 0) return Optional.of(Command.errorMessage); - String template = "%-2s | %-30s | %s\n"; - String res = ""; - res += String.format(template, "ID", "Название задачи", "Статус"); - res += "-".repeat(50) + "\n"; - - if (service.list().size() == 0) - return Optional.of(res + "\nСписок задач пуст."); - - for (Task task : service.list()) { - SimpleTask.Data data = ((SimpleTask) task).data(); - res += String.format(template, data.id(), data.title(), data.done() ? "выполнено" : "не выполнено"); - } + var res = formatWithTable(service.list(), "Список задач пуст."); + return Optional.of(res); } @@ -36,4 +27,21 @@ public class ListCommand implements Command { public String usage() { return String.format(templateUsage, name(), "Список всех задач."); } + + String formatWithTable(List tasks, String msgIfEmpty){ + String template = "%-2s | %-30s | %s\n"; + String res = ""; + res += String.format(template, "ID", "Название задачи", "Статус"); + res += "-".repeat(50) + "\n"; + + if (tasks.size() == 0) + return res + "\n" + msgIfEmpty; + + for (Task task : tasks) { + SimpleTask.Data data = ((SimpleTask) task).data(); + res += String.format(template, data.id(), data.title(), data.done() ? "выполнено" : "не выполнено"); + } + + return res; + } } diff --git a/todo/src/main/java/ru/kamask/pet/todo/cli/SearchCommand.java b/todo/src/main/java/ru/kamask/pet/todo/cli/SearchCommand.java new file mode 100644 index 0000000..ae4ede6 --- /dev/null +++ b/todo/src/main/java/ru/kamask/pet/todo/cli/SearchCommand.java @@ -0,0 +1,30 @@ +package ru.kamask.pet.todo.cli; + +import java.util.Optional; + +import ru.kamask.pet.todo.service.TaskService; + +public class SearchCommand implements Command { + @Override + public String name() { + return "search"; + } + + @Override + public String usage() { + return String.format(templateUsage, name() + " <текст>", "Поиск задач по тексту (минимум 3 символа)"); + } + + @Override + public Optional handle(String[] args, TaskService service) { + if (args.length != 1) + return Optional.of(Command.errorMessage); + if (args[0].length() < 3) + return Optional.of("Длина запроса должна быть не менее 3 символов."); + + var matchTask = service.search(args[0]); + var res = new ListCommand().formatWithTable(matchTask, "Не найдено задач, соответствующих запросу."); + + return Optional.of(res); + } +} diff --git a/todo/src/main/java/ru/kamask/pet/todo/service/TaskService.java b/todo/src/main/java/ru/kamask/pet/todo/service/TaskService.java index 29fd8dd..e8e0498 100644 --- a/todo/src/main/java/ru/kamask/pet/todo/service/TaskService.java +++ b/todo/src/main/java/ru/kamask/pet/todo/service/TaskService.java @@ -42,4 +42,10 @@ public class TaskService { public boolean has(int id) { return repo.has(id); } + + public List search(String query) { + return repo.findAll().stream() + .filter(task -> ((SimpleTask) task).data().title().contains(query)) + .toList(); + } }