futriis/internal/client/111handler.go

106 lines
2.8 KiB
Go
Raw Normal View History

2026-02-27 22:04:04 +03:00
// /futriis/internal/client/handler.go
// Пакет client реализует обработку команд клиента СУБД Futriis
// Обеспечивает взаимодействие с движком и форматированный вывод результатов
package client
import (
"bufio"
"fmt"
"os"
"strings"
"futriis/internal/engine"
"futriis/pkg/utils"
)
// CommandHandler обрабатывает команды клиента
type CommandHandler struct {
engine *engine.Engine
}
// NewCommandHandler создаёт новый обработчик команд
func NewCommandHandler(engine *engine.Engine) *CommandHandler {
return &CommandHandler{
engine: engine,
}
}
// HandleCommand обрабатывает одну команду
func (h *CommandHandler) HandleCommand(input string) (bool, error) {
// Удаляем лишние пробелы
input = strings.TrimSpace(input)
// Если ввод пустой, просто возвращаемся без вывода
if input == "" {
return false, nil
}
// Разбиваем на части для проверки команды выхода
parts := strings.Fields(input)
if len(parts) == 0 {
return false, nil
}
command := strings.ToLower(parts[0])
// Проверяем команду выхода
if command == "exit" || command == "quit" {
return true, nil
}
// Выполняем команду через движок
result, err := h.engine.Execute(input)
if err != nil {
utils.PrintError("%v", err)
} else if result != "" {
// Если результат не пустой, выводим его без дополнительного форматирования
// так как движок уже возвращает цветной результат
fmt.Println(result)
}
return false, nil
}
// RunREPL запускает цикл чтения-выполнения-вывода
func (h *CommandHandler) RunREPL() error {
scanner := bufio.NewScanner(os.Stdin)
// Проверяем, было ли восстановление из AOF
if h.engine.WasAOFRecovered() {
utils.PrintPromptMessage("State successfully recovered from AOF")
}
utils.PrintPromptMessage("Welcome to Futriis DB. Type 'help' for command list.")
// Добавляем пустую строку после приветствия
fmt.Println()
for {
// Выводим приглашение
fmt.Print(utils.GetPrompt())
// Читаем команду
if !scanner.Scan() {
break
}
input := scanner.Text()
// Обрабатываем команду
exit, err := h.HandleCommand(input)
if err != nil {
utils.PrintError("%v", err)
}
if exit {
break
}
}
if err := scanner.Err(); err != nil {
return fmt.Errorf("ошибка чтения ввода: %v", err)
}
return nil
}