Files
fush/internal/config/config.go
2026-05-22 00:26:27 +03:00

132 lines
3.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 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)
}