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() }