package main import ( "strconv" "strings" "time" ) type ( // https://wiki.alpinelinux.org/wiki/Apk_spec Entry struct { Checksum string // C Version string // V Name string // P Architecture *string // A PackageSize int // S InstalledSize int // I Description string // T Url string // U License string // L Origin *string // o Maintainer *string // m BuildTime *time.Time // t Commit *string // c ProviderPriority *int // k Dependencies []string // D Provides []string // p InstallIf []string // i } ) func (e *Entry) Properties() map[string]string { p := make(map[string]string) p["checksum"] = e.Checksum p["version"] = e.Version p["name"] = e.Name p["package size"] = strconv.Itoa(e.PackageSize) p["installed size"] = strconv.Itoa(e.InstalledSize) p["description"] = e.Description p["url"] = e.Url p["license"] = e.License if e.Architecture != nil { p["architecture"] = *e.Architecture } if e.Origin != nil { p["origin"] = *e.Origin } if e.Maintainer != nil { p["maintainer"] = *e.Maintainer } if e.BuildTime != nil { p["build time"] = e.BuildTime.String() } if e.Commit != nil { p["commit"] = *e.Commit } if e.ProviderPriority != nil { p["provider priority"] = strconv.Itoa(*e.ProviderPriority) } if len(e.Dependencies) > 0 { p["dependencies"] = strings.Join(e.Dependencies, " ") } if len(e.Provides) > 0 { p["provides"] = strings.Join(e.Provides, " ") } if len(e.InstallIf) > 0 { p["install if"] = strings.Join(e.InstallIf, " ") } return p } func ptr[T any](v T) *T { return &v } func split(line string) (string, string) { parts := strings.SplitN(line, ":", 2) return parts[0], parts[1] } func toInt(v string) int { i, _ := strconv.Atoi(v) return i } func Parse(lines []string) *Entry { entry := &Entry{} for _, line := range lines { r, c := split(line) switch r { case "C": entry.Checksum = c case "V": entry.Version = c case "P": entry.Name = c case "A": entry.Architecture = &c case "S": entry.PackageSize = toInt(c) case "I": entry.InstalledSize = toInt(c) case "T": entry.Description = c case "U": entry.Url = c case "L": entry.License = c case "o": entry.Origin = &c case "m": entry.Maintainer = &c case "t": entry.BuildTime = ptr(time.Unix(int64(toInt(c)), 0)) case "c": entry.Commit = &c case "k": entry.ProviderPriority = ptr(toInt(c)) case "D": entry.Dependencies = strings.Split(c, " ") case "p": entry.Dependencies = strings.Split(c, " ") case "i": entry.Dependencies = strings.Split(c, " ") } } return entry }