github.com/avahowell/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  }