Upload files to "internal/client"

This commit is contained in:
Григорий Сафронов 2026-03-01 19:54:54 +00:00
parent 4ab2cb34bb
commit f0684b280c

109
internal/client/handler.go Normal file
View File

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