From f0684b280c42eeec66263dcabc7e5516ecbea306 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=93=D1=80=D0=B8=D0=B3=D0=BE=D1=80=D0=B8=D0=B9=20=D0=A1?= =?UTF-8?q?=D0=B0=D1=84=D1=80=D0=BE=D0=BD=D0=BE=D0=B2?= Date: Sun, 1 Mar 2026 19:54:54 +0000 Subject: [PATCH] Upload files to "internal/client" --- internal/client/handler.go | 109 +++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 internal/client/handler.go diff --git a/internal/client/handler.go b/internal/client/handler.go new file mode 100644 index 0000000..6e357fb --- /dev/null +++ b/internal/client/handler.go @@ -0,0 +1,109 @@ +// /futriis/internal/client/handler.go +// Пакет client реализует обработчик команд для интерактивного режима +// Обеспечивает взаимодействие с пользователем через командную строку + +package client + +import ( + "bufio" + "fmt" + "os" + "strings" + + "futriis/internal/cli" + "futriis/internal/engine" + "futriis/pkg/utils" +) + +// CommandHandler обрабатывает команды пользователя +type CommandHandler struct { + engine *engine.Engine + prompt *cli.Prompt +} + +// NewCommandHandler создает новый обработчик команд +func NewCommandHandler(eng *engine.Engine) *CommandHandler { + return &CommandHandler{ + engine: eng, + prompt: cli.NewPrompt(), + } +} + +// RunREPL запускает интерактивный режим с поддержкой истории команд +func (h *CommandHandler) RunREPL() error { + // Бесконечный цикл обработки команд + for { + // Читаем команду с поддержкой истории + input, err := h.prompt.ReadLine() + if err != nil { + // Если произошла ошибка при чтении, пробуем простой режим + utils.PrintWarning("Ошибка чтения ввода: %v. Переключаюсь на простой режим...", err) + return h.RunSimpleREPL() + } + + // Обрабатываем пустой ввод + input = strings.TrimSpace(input) + if input == "" { + continue + } + + // Проверяем команды выхода + if strings.ToLower(input) == "exit" || strings.ToLower(input) == "quit" { + // Просто выходим без сообщения + break + } + + // Выполняем команду через движок + result, err := h.engine.Execute(input) + if err != nil { + utils.PrintError("%v", err) + } else if result != "" { + fmt.Println(result) + } + } + + // Добавляем пустую строку перед выходом в bash + fmt.Println() + return nil +} + +// RunSimpleREPL запускает упрощенный режим без поддержки истории команд +func (h *CommandHandler) RunSimpleREPL() error { + scanner := bufio.NewScanner(os.Stdin) + + utils.PrintWarning("Запущен упрощенный режим ввода. Стрелки и история команд не поддерживаются.") + + for { + // Выводим приглашение + fmt.Print(utils.GetPrompt()) + + // Читаем строку + if !scanner.Scan() { + break + } + + // Обрабатываем ввод + input := strings.TrimSpace(scanner.Text()) + if input == "" { + continue + } + + // Проверяем команды выхода + if strings.ToLower(input) == "exit" || strings.ToLower(input) == "quit" { + // Просто выходим без сообщения + break + } + + // Выполняем команду через движок + result, err := h.engine.Execute(input) + if err != nil { + utils.PrintError("%v", err) + } else if result != "" { + fmt.Println(result) + } + } + + // Добавляем пустую строку перед выходом в bash + fmt.Println() + return scanner.Err() +}