first commit
This commit is contained in:
90
cmd/fush/main.go
Normal file
90
cmd/fush/main.go
Normal file
@@ -0,0 +1,90 @@
|
||||
// main.go - точка входа в приложение fush shell
|
||||
// Загружает конфигурацию, инициализирует логгер и основные компоненты
|
||||
// Обрабатывает системные сигналы для корректного завершения работы
|
||||
// Содержит информацию о версии и времени сборки
|
||||
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"os/signal"
|
||||
"path/filepath"
|
||||
"syscall"
|
||||
|
||||
"fush/internal/config"
|
||||
"fush/internal/logger"
|
||||
"fush/internal/shell"
|
||||
"fush/pkg/ansi"
|
||||
)
|
||||
|
||||
var (
|
||||
BuildTime = "unknown"
|
||||
GitCommit = "unknown"
|
||||
)
|
||||
|
||||
func main() {
|
||||
// Обработка сигналов для корректного завершения
|
||||
sigChan := make(chan os.Signal, 1)
|
||||
signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM)
|
||||
|
||||
// Загрузка конфигурации
|
||||
configPath := getConfigPath()
|
||||
cfg, err := config.Load(configPath)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Ошибка загрузки конфигурации: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
|
||||
// Инициализация логгера
|
||||
log, err := logger.New(cfg.LogFile)
|
||||
if err != nil {
|
||||
fmt.Fprintf(os.Stderr, "Ошибка инициализации логгера: %v\n", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
defer log.Close()
|
||||
|
||||
// Логирование запуска
|
||||
log.Info("Запуск fush shell",
|
||||
"version", GitCommit,
|
||||
"build_time", BuildTime,
|
||||
"os", cfg.OS)
|
||||
|
||||
// Вывод приветственного сообщения (цвет BrightCyan - такой же как в help)
|
||||
fmt.Println()
|
||||
ansi.Println(ansi.BrightCyan, "Welcome to fush shell")
|
||||
fmt.Println()
|
||||
|
||||
// Создание и запуск shell
|
||||
sh := shell.New(cfg, log)
|
||||
|
||||
// Запуск в отдельной горутине для обработки сигналов
|
||||
go func() {
|
||||
<-sigChan
|
||||
log.Info("Получен сигнал завершения")
|
||||
sh.Shutdown()
|
||||
os.Exit(0)
|
||||
}()
|
||||
|
||||
// Запуск основного цикла shell
|
||||
if err := sh.Run(); err != nil {
|
||||
log.Error("Ошибка выполнения shell", "error", err)
|
||||
os.Exit(1)
|
||||
}
|
||||
}
|
||||
|
||||
// getConfigPath возвращает путь к файлу конфигурации
|
||||
func getConfigPath() string {
|
||||
// Приоритет: флаг командной строки, переменная окружения, стандартный путь
|
||||
if path := os.Getenv("FUSH_CONFIG"); path != "" {
|
||||
return path
|
||||
}
|
||||
|
||||
home, err := os.Getenv("HOME"), error(nil)
|
||||
if err != nil {
|
||||
home = "."
|
||||
}
|
||||
|
||||
// Стандартный путь: ~/.config/fush/fush.toml
|
||||
return filepath.Join(home, ".config", "fush", "fush.toml")
|
||||
}
|
||||
Reference in New Issue
Block a user