aboutsummaryrefslogtreecommitdiff
path: root/parser/parser.go
diff options
context:
space:
mode:
Diffstat (limited to 'parser/parser.go')
-rw-r--r--parser/parser.go88
1 files changed, 88 insertions, 0 deletions
diff --git a/parser/parser.go b/parser/parser.go
new file mode 100644
index 0000000..8996b8c
--- /dev/null
+++ b/parser/parser.go
@@ -0,0 +1,88 @@
+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
+}