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 }