132 lines
3.6 KiB
Go
132 lines
3.6 KiB
Go
// 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)
|
||
}
|