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