github.com/johnathanhowell/sia@v0.5.1-beta.0.20160524050156-83dcc3d37c94/persist/json.go (about) 1 package persist 2 3 import ( 4 "encoding/json" 5 "io" 6 "os" 7 ) 8 9 // Load loads json data from a reader. 10 func Load(meta Metadata, data interface{}, r io.Reader) error { 11 var header, version string 12 dec := json.NewDecoder(r) 13 if err := dec.Decode(&header); err != nil { 14 return err 15 } 16 if header != meta.Header { 17 return ErrBadHeader 18 } 19 if err := dec.Decode(&version); err != nil { 20 return err 21 } 22 if version != meta.Version { 23 return ErrBadVersion 24 } 25 if err := dec.Decode(data); err != nil { 26 return err 27 } 28 29 return nil 30 } 31 32 // LoadFile loads json data from a file. 33 func LoadFile(meta Metadata, data interface{}, filename string) error { 34 file, err := os.Open(filename) 35 if err != nil { 36 return err 37 } 38 defer file.Close() 39 err = Load(meta, data, file) 40 if err != nil { 41 return err 42 } 43 return nil 44 } 45 46 // Save saves json data to a writer. 47 func Save(meta Metadata, data interface{}, w io.Writer) error { 48 b, err := json.MarshalIndent(data, "", "\t") 49 if err != nil { 50 return err 51 } 52 53 enc := json.NewEncoder(w) 54 if err := enc.Encode(meta.Header); err != nil { 55 return err 56 } 57 if err := enc.Encode(meta.Version); err != nil { 58 return err 59 } 60 if _, err = w.Write(b); err != nil { 61 return err 62 } 63 64 return nil 65 } 66 67 // SaveFile atomically saves json data to a file. 68 func SaveFile(meta Metadata, data interface{}, filename string) error { 69 file, err := NewSafeFile(filename) 70 if err != nil { 71 return err 72 } 73 defer file.Close() 74 err = Save(meta, data, file) 75 if err != nil { 76 return err 77 } 78 return file.Commit() 79 } 80 81 // SaveFileSync atomically saves json data to a file and then syncs to disk. 82 func SaveFileSync(meta Metadata, data interface{}, filename string) error { 83 file, err := NewSafeFile(filename) 84 if err != nil { 85 return err 86 } 87 defer file.Close() 88 err = Save(meta, data, file) 89 if err != nil { 90 return err 91 } 92 return file.CommitSync() 93 }