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  }