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