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