github.com/scottcagno/storage@v1.8.0/cmd/index/index.go (about)

     1  package main
     2  
     3  import (
     4  	"encoding/json"
     5  	"io"
     6  	"os"
     7  )
     8  
     9  type RecordFn func(at io.Reader) (json.RawMessage, error)
    10  
    11  func MakeIndex(path string, fn RecordFn) error {
    12  	r, err := os.OpenFile(path, os.O_RDONLY, 0666)
    13  	if err != nil {
    14  		return err
    15  	}
    16  	w, err := os.OpenFile(path, os.O_WRONLY, 0666)
    17  	if err != nil {
    18  		return err
    19  	}
    20  	for {
    21  		rec, err := fn(r)
    22  		if err != nil {
    23  			if err == io.EOF || err == io.ErrUnexpectedEOF {
    24  				break
    25  			}
    26  			return err
    27  		}
    28  		if !json.Valid(rec) {
    29  			return ErrIncomplete
    30  		}
    31  		_, err = w.Write(rec)
    32  		if err != nil {
    33  			return err
    34  		}
    35  	}
    36  
    37  	return nil
    38  }
    39  
    40  func writeRecordIndex(w io.Writer, rec json.RawMessage) error {
    41  	// do something here
    42  	return nil
    43  }
    44  
    45  type foo struct {
    46  	k int    `json:"k"`
    47  	v string `json:"v"`
    48  }
    49  
    50  func (f *foo) MarshalJSON() ([]byte, error) {
    51  	return json.Marshal(struct {
    52  		K int    `json:"k"`
    53  		V string `json:"v"`
    54  	}{
    55  		K: f.k,
    56  		V: f.v,
    57  	})
    58  }
    59  
    60  func (f *foo) UnmarshalJSON(data []byte) error {
    61  	type fooer struct {
    62  		K int    `json:"k"`
    63  		V string `json:"v"`
    64  	}
    65  	var ff fooer
    66  	err := json.Unmarshal(data, &ff)
    67  	if err != nil {
    68  		return err
    69  	}
    70  	f.k = ff.K
    71  	f.v = ff.V
    72  	return nil
    73  }