aboutsummaryrefslogtreecommitdiff
path: root/parser.go
diff options
context:
space:
mode:
Diffstat (limited to 'parser.go')
-rw-r--r--parser.go145
1 files changed, 145 insertions, 0 deletions
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
+}