Merge pull request #892 from harshavardhana/add-quick-version

Add quick.CheckVersion() to verify config version quickly before unma…
This commit is contained in:
Harshavardhana 2015-10-07 17:49:16 -07:00
commit e719adec8b
2 changed files with 97 additions and 34 deletions

View File

@ -82,6 +82,80 @@ func New(data interface{}) (Config, *probe.Error) {
return d, nil return d, nil
} }
// CheckVersion - loads json and compares the version number provided returns back true or false - any failure
// is returned as error.
func CheckVersion(filename string, version string) (bool, *probe.Error) {
_, err := os.Stat(filename)
if err != nil {
return false, probe.NewError(err)
}
fileData, err := ioutil.ReadFile(filename)
if err != nil {
return false, probe.NewError(err)
}
if runtime.GOOS == "windows" {
fileData = []byte(strings.Replace(string(fileData), "\r\n", "\n", -1))
}
data := struct {
Version string
}{
Version: "",
}
err = json.Unmarshal(fileData, &data)
if err != nil {
switch err := err.(type) {
case *json.SyntaxError:
return false, probe.NewError(FormatJSONSyntaxError(bytes.NewReader(fileData), err))
default:
return false, probe.NewError(err)
}
}
config, perr := New(data)
if perr != nil {
return false, perr.Trace()
}
if config.Version() != version {
return false, nil
}
return true, nil
}
// Load - loads json config from filename for the a given struct data
func Load(filename string, data interface{}) (Config, *probe.Error) {
_, err := os.Stat(filename)
if err != nil {
return nil, probe.NewError(err)
}
fileData, err := ioutil.ReadFile(filename)
if err != nil {
return nil, probe.NewError(err)
}
if runtime.GOOS == "windows" {
fileData = []byte(strings.Replace(string(fileData), "\r\n", "\n", -1))
}
err = json.Unmarshal(fileData, &data)
if err != nil {
switch err := err.(type) {
case *json.SyntaxError:
return nil, probe.NewError(FormatJSONSyntaxError(bytes.NewReader(fileData), err))
default:
return nil, probe.NewError(err)
}
}
config, perr := New(data)
if perr != nil {
return nil, perr.Trace()
}
return config, nil
}
// Version returns the current config file format version // Version returns the current config file format version
func (d config) Version() string { func (d config) Version() string {
st := structs.New(d.data) st := structs.New(d.data)
@ -127,40 +201,6 @@ func (d config) Save(filename string) *probe.Error {
return nil return nil
} }
// Load - loads json config
func Load(filename string, data interface{}) (Config, *probe.Error) {
_, err := os.Stat(filename)
if err != nil {
return nil, probe.NewError(err)
}
fileData, err := ioutil.ReadFile(filename)
if err != nil {
return nil, probe.NewError(err)
}
if runtime.GOOS == "windows" {
fileData = []byte(strings.Replace(string(fileData), "\r\n", "\n", -1))
}
err = json.Unmarshal(fileData, &data)
if err != nil {
switch err := err.(type) {
case *json.SyntaxError:
return nil, probe.NewError(FormatJSONSyntaxError(bytes.NewReader(fileData), err))
default:
return nil, probe.NewError(err)
}
}
config, perr := New(data)
if perr != nil {
return nil, perr.Trace()
}
return config, nil
}
// Load - loads JSON config from file and merge with currently set values // Load - loads JSON config from file and merge with currently set values
func (d *config) Load(filename string) *probe.Error { func (d *config) Load(filename string) *probe.Error {
d.lock.Lock() d.lock.Lock()

View File

@ -57,6 +57,29 @@ func (s *MySuite) TestCheckData(c *C) {
c.Assert(err, IsNil) c.Assert(err, IsNil)
} }
func (s *MySuite) TestVersion(c *C) {
defer os.RemoveAll("test.json")
type myStruct struct {
Version string
User string
Password string
Folders []string
}
saveMe := myStruct{"1", "guest", "nopassword", []string{"Work", "Documents", "Music"}}
config, err := quick.New(&saveMe)
c.Assert(err, IsNil)
c.Assert(config, Not(IsNil))
config.Save("test.json")
valid, err := quick.CheckVersion("test.json", "1")
c.Assert(err, IsNil)
c.Assert(valid, Equals, true)
valid, err = quick.CheckVersion("test.json", "2")
c.Assert(err, IsNil)
c.Assert(valid, Equals, false)
}
func (s *MySuite) TestSaveLoad(c *C) { func (s *MySuite) TestSaveLoad(c *C) {
defer os.RemoveAll("test.json") defer os.RemoveAll("test.json")
type myStruct struct { type myStruct struct {