aboutsummaryrefslogtreecommitdiff
path: root/parser/parser.go
blob: 62b0d855ba36b390d7eb5c6bcbe76294cad99bc5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
package parser

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