Refactor unmarshalTOC to use a switch
This is a microptimization, we call strings.ToLower only once, but more importantly it will make it easier to add more fields. Signed-off-by: Miloslav Trmač <mitr@redhat.com>
This commit is contained in:
parent
16b831be1c
commit
8dd381ecf3
|
|
@ -823,81 +823,82 @@ func unmarshalToc(manifest []byte) (*internal.TOC, error) {
|
||||||
iter := jsoniter.ParseBytes(jsoniter.ConfigFastest, manifest)
|
iter := jsoniter.ParseBytes(jsoniter.ConfigFastest, manifest)
|
||||||
|
|
||||||
for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
|
for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
|
||||||
if strings.ToLower(field) == "version" {
|
switch strings.ToLower(field) {
|
||||||
|
case "version":
|
||||||
toc.Version = iter.ReadInt()
|
toc.Version = iter.ReadInt()
|
||||||
continue
|
|
||||||
}
|
case "entries":
|
||||||
if strings.ToLower(field) != "entries" {
|
for iter.ReadArray() {
|
||||||
iter.Skip()
|
var m internal.FileMetadata
|
||||||
continue
|
for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
|
||||||
}
|
switch strings.ToLower(field) {
|
||||||
for iter.ReadArray() {
|
case "type":
|
||||||
var m internal.FileMetadata
|
m.Type = iter.ReadString()
|
||||||
for field := iter.ReadObject(); field != ""; field = iter.ReadObject() {
|
case "name":
|
||||||
switch strings.ToLower(field) {
|
m.Name = iter.ReadString()
|
||||||
case "type":
|
case "linkname":
|
||||||
m.Type = iter.ReadString()
|
m.Linkname = iter.ReadString()
|
||||||
case "name":
|
case "mode":
|
||||||
m.Name = iter.ReadString()
|
m.Mode = iter.ReadInt64()
|
||||||
case "linkname":
|
case "size":
|
||||||
m.Linkname = iter.ReadString()
|
m.Size = iter.ReadInt64()
|
||||||
case "mode":
|
case "uid":
|
||||||
m.Mode = iter.ReadInt64()
|
m.UID = iter.ReadInt()
|
||||||
case "size":
|
case "gid":
|
||||||
m.Size = iter.ReadInt64()
|
m.GID = iter.ReadInt()
|
||||||
case "uid":
|
case "modtime":
|
||||||
m.UID = iter.ReadInt()
|
time, err := time.Parse(time.RFC3339, iter.ReadString())
|
||||||
case "gid":
|
if err != nil {
|
||||||
m.GID = iter.ReadInt()
|
return nil, err
|
||||||
case "modtime":
|
}
|
||||||
time, err := time.Parse(time.RFC3339, iter.ReadString())
|
m.ModTime = &time
|
||||||
if err != nil {
|
case "accesstime":
|
||||||
return nil, err
|
time, err := time.Parse(time.RFC3339, iter.ReadString())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
m.AccessTime = &time
|
||||||
|
case "changetime":
|
||||||
|
time, err := time.Parse(time.RFC3339, iter.ReadString())
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
m.ChangeTime = &time
|
||||||
|
case "devmajor":
|
||||||
|
m.Devmajor = iter.ReadInt64()
|
||||||
|
case "devminor":
|
||||||
|
m.Devminor = iter.ReadInt64()
|
||||||
|
case "digest":
|
||||||
|
m.Digest = iter.ReadString()
|
||||||
|
case "offset":
|
||||||
|
m.Offset = iter.ReadInt64()
|
||||||
|
case "endoffset":
|
||||||
|
m.EndOffset = iter.ReadInt64()
|
||||||
|
case "chunksize":
|
||||||
|
m.ChunkSize = iter.ReadInt64()
|
||||||
|
case "chunkoffset":
|
||||||
|
m.ChunkOffset = iter.ReadInt64()
|
||||||
|
case "chunkdigest":
|
||||||
|
m.ChunkDigest = iter.ReadString()
|
||||||
|
case "chunktype":
|
||||||
|
m.ChunkType = iter.ReadString()
|
||||||
|
case "xattrs":
|
||||||
|
m.Xattrs = make(map[string]string)
|
||||||
|
for key := iter.ReadObject(); key != ""; key = iter.ReadObject() {
|
||||||
|
m.Xattrs[key] = iter.ReadString()
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
iter.Skip()
|
||||||
}
|
}
|
||||||
m.ModTime = &time
|
|
||||||
case "accesstime":
|
|
||||||
time, err := time.Parse(time.RFC3339, iter.ReadString())
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
m.AccessTime = &time
|
|
||||||
case "changetime":
|
|
||||||
time, err := time.Parse(time.RFC3339, iter.ReadString())
|
|
||||||
if err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
m.ChangeTime = &time
|
|
||||||
case "devmajor":
|
|
||||||
m.Devmajor = iter.ReadInt64()
|
|
||||||
case "devminor":
|
|
||||||
m.Devminor = iter.ReadInt64()
|
|
||||||
case "digest":
|
|
||||||
m.Digest = iter.ReadString()
|
|
||||||
case "offset":
|
|
||||||
m.Offset = iter.ReadInt64()
|
|
||||||
case "endoffset":
|
|
||||||
m.EndOffset = iter.ReadInt64()
|
|
||||||
case "chunksize":
|
|
||||||
m.ChunkSize = iter.ReadInt64()
|
|
||||||
case "chunkoffset":
|
|
||||||
m.ChunkOffset = iter.ReadInt64()
|
|
||||||
case "chunkdigest":
|
|
||||||
m.ChunkDigest = iter.ReadString()
|
|
||||||
case "chunktype":
|
|
||||||
m.ChunkType = iter.ReadString()
|
|
||||||
case "xattrs":
|
|
||||||
m.Xattrs = make(map[string]string)
|
|
||||||
for key := iter.ReadObject(); key != ""; key = iter.ReadObject() {
|
|
||||||
m.Xattrs[key] = iter.ReadString()
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
iter.Skip()
|
|
||||||
}
|
}
|
||||||
|
if m.Type == TypeReg && m.Size == 0 && m.Digest == "" {
|
||||||
|
m.Digest = digestSha256Empty
|
||||||
|
}
|
||||||
|
toc.Entries = append(toc.Entries, m)
|
||||||
}
|
}
|
||||||
if m.Type == TypeReg && m.Size == 0 && m.Digest == "" {
|
|
||||||
m.Digest = digestSha256Empty
|
default:
|
||||||
}
|
iter.Skip()
|
||||||
toc.Entries = append(toc.Entries, m)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue