106 lines
2.8 KiB
Go
106 lines
2.8 KiB
Go
// /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
|
||
}
|