Run JSON decoding through the usual setting of defaults and fixing up

I see no reason not to do this, and it gives a unified place (the prepare()
call) to initialize cached attributes and so on.
This commit is contained in:
Jakob Borg 2015-11-04 20:30:47 +00:00
parent 283671fa9d
commit 9df701906f
2 changed files with 17 additions and 3 deletions

View File

@ -562,8 +562,7 @@ func (s *apiSvc) postSystemConfig(w http.ResponseWriter, r *http.Request) {
s.systemConfigMut.Lock() s.systemConfigMut.Lock()
defer s.systemConfigMut.Unlock() defer s.systemConfigMut.Unlock()
var to config.Configuration to, err := config.ReadJSON(r.Body, myID)
err := json.NewDecoder(r.Body).Decode(&to)
if err != nil { if err != nil {
l.Warnln("decoding posted config:", err) l.Warnln("decoding posted config:", err)
http.Error(w, err.Error(), 500) http.Error(w, err.Error(), 500)

View File

@ -8,6 +8,7 @@
package config package config
import ( import (
"encoding/json"
"encoding/xml" "encoding/xml"
"io" "io"
"math/rand" "math/rand"
@ -83,6 +84,20 @@ func ReadXML(r io.Reader, myID protocol.DeviceID) (Configuration, error) {
return cfg, err return cfg, err
} }
func ReadJSON(r io.Reader, myID protocol.DeviceID) (Configuration, error) {
var cfg Configuration
setDefaults(&cfg)
setDefaults(&cfg.Options)
setDefaults(&cfg.GUI)
err := json.NewDecoder(r).Decode(&cfg)
cfg.OriginalVersion = cfg.Version
cfg.prepare(myID)
return cfg, err
}
type Configuration struct { type Configuration struct {
Version int `xml:"version,attr" json:"version"` Version int `xml:"version,attr" json:"version"`
Folders []FolderConfiguration `xml:"folder" json:"folders"` Folders []FolderConfiguration `xml:"folder" json:"folders"`
@ -133,7 +148,7 @@ func (cfg *Configuration) WriteXML(w io.Writer) error {
func (cfg *Configuration) prepare(myID protocol.DeviceID) { func (cfg *Configuration) prepare(myID protocol.DeviceID) {
fillNilSlices(&cfg.Options) fillNilSlices(&cfg.Options)
// Initialize an empty slices // Initialize any empty slices
if cfg.Folders == nil { if cfg.Folders == nil {
cfg.Folders = []FolderConfiguration{} cfg.Folders = []FolderConfiguration{}
} }