GoBroke/conf/funcs.go
2024-12-20 01:29:56 -05:00

93 lines
1.8 KiB
Go

package conf
import (
`encoding/json`
"github.com/BurntSushi/toml"
"github.com/creasty/defaults"
"github.com/goccy/go-yaml"
"r00t2.io/sysutils/paths"
)
// NewConfig returns a conf.Config from filepath path.
func NewConfig(path string) (cfg *Config, err error) {
var b []byte
if err = paths.RealPath(&path); err != nil {
return
}
if cfg, err = NewConfigFromBytes(b); err != nil {
return
}
cfg.confPath = new(string)
*cfg.confPath = path
return
}
// NewConfigFromBytes returns a conf.Config from bytes b. b may be a JSON, TOML, XML, or YAML representation.
func NewConfigFromBytes(b []byte) (cfg *Config, err error) {
if err = json.Unmarshal(b, &cfg); err != nil {
if err = yaml.Unmarshal(b, &cfg); err != nil {
if err = toml.Unmarshal(b, &cfg); err != nil {
if err = toml.Unmarshal(b, &cfg); err != nil {
err = ErrUnkownSyntax
return
}
}
}
}
if err = defaults.Set(cfg); err != nil {
return
}
if cfg.CacheDB != ":memory:" {
if err = paths.RealPath(&cfg.CacheDB); err != nil {
return
}
if cfg.CacheDbPerms == nil {
cfg.CacheDbPerms = new(Perms)
}
if err = cfg.CacheDbPerms.SetMissing(); err != nil {
return
}
}
if err = validate.Struct(cfg); err != nil {
return
}
for _, t := range cfg.Tunnels {
t.cfg = cfg
if t.Username == nil {
if cfg.Username == nil {
err = ErrMissingUser
return
} else {
t.Username = cfg.Username
}
}
if t.TemplateConfigs != nil && len(t.TemplateConfigs) > 0 {
for _, tpl := range t.TemplateConfigs {
if err = paths.RealPath(&tpl.Template); err != nil {
return
}
if err = paths.RealPath(&tpl.Dest); err != nil {
return
}
if tpl.Perms != nil {
if err = tpl.Perms.SetMissing(); err != nil {
return
}
}
}
}
}
return
}