first commit

This commit is contained in:
2026-05-22 00:26:27 +03:00
commit c9d6d38491
17 changed files with 2311 additions and 0 deletions

90
cmd/fush/main.go Normal file
View 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")
}