// /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() }