futriis/internal/client/handler.go

110 lines
3.2 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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