futriis/internal/client/handler.go
2026-02-27 22:04:04 +03:00

106 lines
2.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// /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
}