diff --git a/internal/client/handler.go b/internal/client/handler.go new file mode 100644 index 0000000..09e76ba --- /dev/null +++ b/internal/client/handler.go @@ -0,0 +1,105 @@ +// /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) + } + } + + 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) + } + } + + return scanner.Err() +}