first commit
This commit is contained in:
131
internal/config/config.go
Normal file
131
internal/config/config.go
Normal file
@@ -0,0 +1,131 @@
|
||||
// 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)
|
||||
}
|
||||
Reference in New Issue
Block a user