diff options
Diffstat (limited to 'types.go')
| -rw-r--r-- | types.go | 54 |
1 files changed, 54 insertions, 0 deletions
@@ -1,6 +1,7 @@ package main import ( + "encoding/json" "os" "time" ) @@ -18,6 +19,59 @@ type FileMeta struct { Symlink string } +type FileMetaJSON struct { + Size int64 `json:"size"` + Mode uint32 `json:"mode"` + ModTime string `json:"modtime"` + Symlink string `json:"symlink,omitempty"` +} + type Manifest struct { Files map[string]FileMeta } + +type ProtocolMessage struct { + Type string `json:"type"` + Files map[string]FileMetaJSON `json:"files,omitempty"` + Path string `json:"path,omitempty"` + Content []byte `json:"content,omitempty"` +} + +func (m *Manifest) ToJSON() map[string]FileMetaJSON { + files := make(map[string]FileMetaJSON, len(m.Files)) + for k, v := range m.Files { + files[k] = FileMetaJSON{ + Size: v.Size, + Mode: uint32(v.Mode), + ModTime: v.ModTime.UTC().Format(time.RFC3339Nano), + Symlink: v.Symlink, + } + } + return files +} + +func ManifestFromJSON(files map[string]FileMetaJSON) *Manifest { + m := &Manifest{Files: make(map[string]FileMeta, len(files))} + for k, v := range files { + t, _ := time.Parse(time.RFC3339Nano, v.ModTime) + m.Files[k] = FileMeta{ + Size: v.Size, + Mode: os.FileMode(v.Mode), + ModTime: t, + Symlink: v.Symlink, + } + } + return m +} + +func DecodeMessage(data []byte) (*ProtocolMessage, error) { + var msg ProtocolMessage + if err := json.Unmarshal(data, &msg); err != nil { + return nil, err + } + return &msg, nil +} + +func EncodeMessage(msg *ProtocolMessage) ([]byte, error) { + return json.Marshal(msg) +} |
