From a21602a450217333a27419d8168865b21fae6e7e Mon Sep 17 00:00:00 2001 From: Gabriel Arakaki Giovanini Date: Sun, 3 Sep 2023 16:01:20 +0200 Subject: feat: Add option for inputing template Now a template file is required to run the cli command. That gives the user an option to provide its own template file. An default will be provided later. --- parser.go | 145 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 parser.go (limited to 'parser.go') diff --git a/parser.go b/parser.go new file mode 100644 index 0000000..344efca --- /dev/null +++ b/parser.go @@ -0,0 +1,145 @@ +package main + +import ( + "fmt" + "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) FomartLink(format string) string { + c := strings.Replace(*e.Commit, "-dirty", "", -1) + return fmt.Sprintf(format, c, *e.Origin) +} + +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 +} -- cgit v1.2.3