amfora/config/config.go
2020-06-21 17:35:19 -04:00

105 lines
2.5 KiB
Go

package config
import (
"os"
"path/filepath"
"runtime"
"github.com/makeworld-the-better-one/amfora/cache"
homedir "github.com/mitchellh/go-homedir"
"github.com/spf13/viper"
)
var amforaAppData string // Where amfora files are stored on Windows - cached here
var configDir string
var configPath string
var TofuStore = viper.New()
var tofuDBDir string
var tofuDBPath string
func Init() error {
home, err := homedir.Dir()
if err != nil {
panic(err)
}
// Cache AppData path
if runtime.GOOS == "windows" {
appdata, ok := os.LookupEnv("APPDATA")
if ok {
amforaAppData = filepath.Join(appdata, "amfora")
} else {
amforaAppData = filepath.Join(home, filepath.FromSlash("AppData/Roaming/amfora/"))
}
}
// Cache config directory and file paths
if runtime.GOOS == "windows" {
configDir = amforaAppData
} else {
// Unix / POSIX system
configDir = filepath.Join(home, ".config", "amfora")
}
configPath = filepath.Join(configDir, "config.toml")
// Cache TOFU db directory and file paths
// Windows just stores it in APPDATA along with other stuff
if runtime.GOOS == "windows" {
tofuDBDir = amforaAppData
} else {
// XDG cache dir on POSIX systems
tofuDBDir = filepath.Join(home, ".cache", "amfora")
}
tofuDBPath = filepath.Join(tofuDBDir, "tofu.toml")
err = os.MkdirAll(configDir, 0755)
if err != nil {
return err
}
f, err := os.OpenFile(configPath, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666)
if err == nil {
// Config file doesn't exist yet, write the default one
_, err = f.Write(defaultConf)
if err != nil {
f.Close()
return err
}
f.Close()
}
err = os.MkdirAll(tofuDBDir, 0755)
if err != nil {
return err
}
os.OpenFile(tofuDBPath, os.O_RDWR|os.O_CREATE|os.O_EXCL, 0666)
TofuStore.SetConfigFile(tofuDBPath)
TofuStore.SetConfigType("toml")
err = TofuStore.ReadInConfig()
if err != nil {
return err
}
viper.SetDefault("a-general.home", "gemini.circumlunar.space")
viper.SetDefault("a-general.http", "default")
viper.SetDefault("a-general.search", "gus.guru/search")
viper.SetDefault("a-general.color", true)
viper.SetDefault("a-general.bullets", true)
viper.SetDefault("a-general.left_margin", 0.15)
viper.SetDefault("a-general.max_width", 100)
viper.SetDefault("cache.max_size", 0)
viper.SetDefault("cache.max_pages", 20)
viper.SetConfigFile(configPath)
viper.SetConfigType("toml")
err = viper.ReadInConfig()
if err != nil {
return err
}
// Setup cache from config
cache.SetMaxSize(viper.GetInt("cache.max_size"))
cache.SetMaxPages(viper.GetInt("cache.max_pages"))
return nil
}