Files

132 lines
3.6 KiB
Go
Raw Permalink Normal View History

2026-05-22 00:26:27 +03:00
// config.go - управление конфигурацией fush shell
// Загружает и сохраняет настройки в формате TOML
// Предоставляет конфигурацию по умолчанию для новой установки
// Управляет переменными окружения и путями к директориям
package config
import (
"os"
"path/filepath"
"runtime"
"github.com/BurntSushi/toml"
)
// Config представляет структуру конфигурации fush
type Config struct {
// Общие настройки
Prompt string `toml:"prompt"`
PromptColor string `toml:"prompt_color"`
// Директории
LuaScriptsDir string `toml:"lua_scripts_dir"`
HistoryFile string `toml:"history_file"`
LogFile string `toml:"log_file"`
// Настройки истории
HistorySize int `toml:"history_size"`
// Переменные окружения
Environment map[string]string `toml:"environment"`
// ОС (определяется автоматически)
OS string `toml:"-"`
}
// DefaultConfig возвращает конфигурацию по умолчанию
func DefaultConfig() *Config {
home, _ := os.UserHomeDir()
cfg := &Config{
Prompt: "fush:-> ",
PromptColor: "#00bfff",
LuaScriptsDir: filepath.Join(home, ".local", "share", "fush", "lua"),
HistoryFile: filepath.Join(home, ".cache", "fush", "history"),
LogFile: filepath.Join(home, ".cache", "fush", "fush.log"),
HistorySize: 1000,
Environment: make(map[string]string),
}
// Определение ОС
cfg.OS = runtime.GOOS
if cfg.OS == "sunos" {
cfg.OS = "OpenIndiana"
}
// Установка переменных окружения по умолчанию
cfg.Environment["PATH"] = os.Getenv("PATH")
cfg.Environment["HOME"] = home
cfg.Environment["SHELL"] = os.Getenv("SHELL")
cfg.Environment["USER"] = os.Getenv("USER")
return cfg
}
// Load загружает конфигурацию из файла
func Load(path string) (*Config, error) {
cfg := DefaultConfig()
// Проверяем существование файла
if _, err := os.Stat(path); os.IsNotExist(err) {
// Создаем директорию для конфигурации
configDir := filepath.Dir(path)
if err := os.MkdirAll(configDir, 0755); err != nil {
return nil, err
}
// Сохраняем конфигурацию по умолчанию
if err := Save(cfg, path); err != nil {
return nil, err
}
return cfg, nil
}
// Загружаем конфигурацию
if _, err := toml.DecodeFile(path, cfg); err != nil {
return nil, err
}
// Создаем необходимые директории
if err := os.MkdirAll(filepath.Dir(cfg.HistoryFile), 0755); err != nil {
return nil, err
}
if err := os.MkdirAll(filepath.Dir(cfg.LogFile), 0755); err != nil {
return nil, err
}
if err := os.MkdirAll(cfg.LuaScriptsDir, 0755); err != nil {
return nil, err
}
return cfg, nil
}
// Save сохраняет конфигурацию в файл
func Save(cfg *Config, path string) error {
file, err := os.Create(path)
if err != nil {
return err
}
defer file.Close()
encoder := toml.NewEncoder(file)
return encoder.Encode(cfg)
}
// GetEnv возвращает значение переменной окружения
func (c *Config) GetEnv(key string) string {
if val, ok := c.Environment[key]; ok {
return val
}
return os.Getenv(key)
}
// SetEnv устанавливает переменную окружения
func (c *Config) SetEnv(key, value string) {
c.Environment[key] = value
os.Setenv(key, value)
}