Upload files to "internal/client"
This commit is contained in:
parent
0bd8cffce4
commit
e0cff24ce5
105
internal/client/handler.go
Normal file
105
internal/client/handler.go
Normal file
@ -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()
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user