gocc/config.go

101 lines
2.2 KiB
Go

package main
import (
"encoding/json"
"errors"
"io"
"os"
"path/filepath"
"strings"
"git.milar.in/milarin/configfile"
)
type Config struct {
OutputDir string `json:"output_dir"`
OutputFile string `json:"output_file"`
OS []string `json:"os"`
Arch []string `json:"arch"`
Silent bool `json:"silent"`
NoCompress bool `json:"no_compress"`
NumThreads int `json:"num_threads"`
KeepDebugFlags bool `json:"debug_flags"`
}
func SetFlagIfDefault[T comparable](flag *T, newValue T, defaultValue T) {
if *flag == defaultValue {
*flag = newValue
}
}
func LoadConfig() error {
configFilePath, err := configfile.Path("json")
if err != nil {
return err
}
file, err := os.Open(configFilePath)
if err != nil {
return err
}
defer file.Close()
cfg := &Config{}
if err := json.NewDecoder(file).Decode(cfg); err != nil {
if errors.Is(err, io.EOF) {
return nil
}
return err
}
SetFlagIfDefault(OutputDir, cfg.OutputDir, DefaultOutputDir)
SetFlagIfDefault(OutputFile, cfg.OutputFile, DefaultOutputFile)
SetFlagIfDefault(OS, strings.Join(cfg.OS, ","), DefaultOS)
SetFlagIfDefault(Arch, strings.Join(cfg.Arch, ","), DefaultArch)
SetFlagIfDefault(Silent, cfg.Silent, DefaultSilent)
SetFlagIfDefault(NoCompress, cfg.NoCompress, DefaultNoCompress)
SetFlagIfDefault(NumThreads, cfg.NumThreads, DefaultNumThreads)
SetFlagIfDefault(KeepDebugFlags, cfg.KeepDebugFlags, DefaultKeepDebugFlags)
return nil
}
func SaveConfig() (string, error) {
configFilePath, err := configfile.Path("json")
if err != nil {
return "", err
}
if err := os.MkdirAll(filepath.Dir(configFilePath), 0744); err != nil {
return configFilePath, err
}
file, err := os.Create(configFilePath)
if err != nil {
return configFilePath, err
}
defer file.Close()
enc := json.NewEncoder(file)
enc.SetIndent("", "\t")
cfg := &Config{
OutputDir: *OutputDir,
OutputFile: *OutputFile,
OS: strings.Split(*OS, ","),
Arch: strings.Split(*Arch, ","),
Silent: *Silent,
NoCompress: *NoCompress,
NumThreads: *NumThreads,
KeepDebugFlags: *KeepDebugFlags,
}
if err := enc.Encode(cfg); err != nil {
return configFilePath, err
}
return configFilePath, nil
}