package parser 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 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 }