110 lines
3.2 KiB
Go
110 lines
3.2 KiB
Go
// /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()
|
||
}
|