66 lines
1.2 KiB
Go
66 lines
1.2 KiB
Go
package uidlist
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
)
|
|
|
|
type Entry struct {
|
|
UID uint64
|
|
Extra map[string][]string
|
|
LastKnownFilename string
|
|
}
|
|
|
|
func ParseEntry(line string) (Entry, error) {
|
|
var out Entry
|
|
|
|
parts := strings.SplitN(strings.TrimSpace(line), ":", 2)
|
|
if len(parts) != 2 {
|
|
return out, errors.New("Couldn't find start of filename")
|
|
}
|
|
|
|
attrs := strings.Split(parts[0], " ")
|
|
if len(attrs) == 0 {
|
|
return out, errors.New("Couldn't find UID")
|
|
}
|
|
|
|
if err := setUint64(attrs[0], &out.UID); err != nil {
|
|
return out, err
|
|
}
|
|
|
|
out.Extra = make(map[string][]string)
|
|
// FIXME: this is all disturbingly similar to header.go
|
|
for _, attr := range attrs[1:] {
|
|
if len(attr) == 0 {
|
|
continue
|
|
}
|
|
|
|
key := attr[0:1]
|
|
value := attr[1:]
|
|
out.Extra[key] = append(out.Extra[key], value)
|
|
}
|
|
|
|
out.LastKnownFilename = parts[1]
|
|
|
|
return out, nil
|
|
}
|
|
|
|
func (e *Entry) Key() string {
|
|
parts := strings.SplitN(e.LastKnownFilename, ":", 2)
|
|
|
|
return parts[0]
|
|
}
|
|
|
|
func (e *Entry) String() string {
|
|
// FIXME: also disturbingly similar to header.go
|
|
var sb strings.Builder
|
|
fmt.Fprintf(&sb, "%d", e.UID)
|
|
for k, v := range e.Extra {
|
|
fmt.Fprintf(&sb, " %s%s", k, v)
|
|
}
|
|
fmt.Fprintf(&sb, " :%s", e.LastKnownFilename)
|
|
|
|
return sb.String()
|
|
}
|