github.com/hoffie/larasync@v0.0.0-20151025221940-0384d2bddcef/repository/metadata.go (about) 1 package repository 2 3 import ( 4 "bytes" 5 "io" 6 7 "github.com/golang/protobuf/proto" 8 9 "github.com/hoffie/larasync/repository/odf" 10 ) 11 12 const ( 13 // MetadataTypeFile marks a Metadata.Type attribute as a file 14 MetadataTypeFile = iota 15 // MetadataTypeDir marks a Metadata.Type attribute as a dir 16 MetadataTypeDir 17 ) 18 19 // Metadata describes information about a node such as its type and name. 20 type Metadata struct { 21 Type int32 22 RepoRelativePath string 23 } 24 25 // WriteTo encodes this Metadata object to the supplied Writer in binary 26 // form. 27 // Returns the number of bytes written and an error if applicable. 28 func (m *Metadata) WriteTo(w io.Writer) (int64, error) { 29 t := odf.NodeType_File 30 if m.Type == MetadataTypeDir { 31 t = odf.NodeType_Dir 32 } 33 pb := &odf.Metadata{ 34 Type: &t, 35 RepoRelativePath: &m.RepoRelativePath, 36 } 37 buf, err := proto.Marshal(pb) 38 if err != nil { 39 return 0, err 40 } 41 written, err := io.Copy(w, bytes.NewBuffer(buf)) 42 return written, err 43 } 44 45 // ReadFrom fills this Metadata's data with the contents supplied by 46 // the binary representation available through the given reader. 47 func (m *Metadata) ReadFrom(r io.Reader) (int64, error) { 48 buf := &bytes.Buffer{} 49 read, err := io.Copy(buf, r) 50 if err != nil { 51 return read, err 52 } 53 pb := &odf.Metadata{} 54 err = proto.Unmarshal(buf.Bytes(), pb) 55 if err != nil { 56 return read, err 57 } 58 m.RepoRelativePath = pb.GetRepoRelativePath() 59 if pb.GetType() == odf.NodeType_Dir { 60 m.Type = MetadataTypeDir 61 } else { 62 m.Type = MetadataTypeFile 63 } 64 return read, nil 65 }