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