aboutsummaryrefslogtreecommitdiff
path: root/parser.go
diff options
context:
space:
mode:
authorGabriel Arakaki Giovanini <mail@gabrielgio.me>2023-09-03 16:01:20 +0200
committerGabriel Arakaki Giovanini <mail@gabrielgio.me>2023-09-03 16:01:20 +0200
commita21602a450217333a27419d8168865b21fae6e7e (patch)
treebcb454130105de02dd97864dc1c977bf30044c38 /parser.go
parent3b21449468a1b20b3ff706fe00a04556a804e627 (diff)
downloadapkdoc-a21602a450217333a27419d8168865b21fae6e7e.tar.gz
apkdoc-a21602a450217333a27419d8168865b21fae6e7e.tar.bz2
apkdoc-a21602a450217333a27419d8168865b21fae6e7e.zip
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.
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
+}