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