package utils import ( "fmt" "time" "robotfs/pb" "google.golang.org/protobuf/proto" ) type Entry struct { FullPath FullPath `json:"fullPath"` IsDir bool `json:"is_dir"` Size uint64 `json:"size"` CreateTime int64 `json:"create_time"` S3Key string `json:"s3key"` ContentType string `json:"content_type"` Etag string `json:"etag"` VersionID string `json:"versionID"` LastModificationTime int64 `json:"modify_time"` Extended map[string][]byte `json:"extended"` } func NewDirEntry(fullPath FullPath) *Entry { return &Entry{ FullPath: fullPath, IsDir: true, CreateTime: time.Now().Unix(), LastModificationTime: time.Now().Unix(), } } func NewFileEntry(fullPath FullPath, s3Key string, size uint64, contentType string, etag string, versionID string) *Entry { return &Entry{ FullPath: fullPath, IsDir: false, Size: size, CreateTime: time.Now().Unix(), LastModificationTime: time.Now().Unix(), S3Key: s3Key, ContentType: contentType, Etag: etag, VersionID: versionID, } } func (entry *Entry) Encode() ([]byte, error) { message := entry.ToProto() return proto.Marshal(message) } func (entry *Entry) Decode(blob []byte) error { message := &pb.FileEntry{} if err := proto.Unmarshal(blob, message); err != nil { return fmt.Errorf("decoding value blob for %s: %v", entry.FullPath, err) } entry.FromProto(message) return nil } func (entry *Entry) ToProto() *pb.FileEntry { return &pb.FileEntry{ FullPath: string(entry.FullPath), IsDir: entry.IsDir, Size: entry.Size, CreateTime: entry.CreateTime, S3Key: entry.S3Key, ContentType: entry.ContentType, Etag: entry.Etag, VersionId: entry.VersionID, LastModificationTime: entry.LastModificationTime, Extended: entry.Extended, } } func (entry *Entry) FromProto(pb *pb.FileEntry) { entry.FullPath = FullPath(pb.FullPath) entry.IsDir = pb.IsDir entry.Size = pb.Size entry.CreateTime = pb.CreateTime entry.S3Key = pb.S3Key entry.ContentType = pb.ContentType entry.Etag = pb.Etag entry.VersionID = pb.VersionId entry.LastModificationTime = pb.LastModificationTime entry.Extended = pb.Extended }