changelog.gno
1.80 Kb ยท 104 lines
1package releases
2
3import (
4 "gno.land/p/demo/ufmt"
5 "gno.land/p/moul/md"
6 "gno.land/p/moul/mdtable"
7)
8
9type changelog struct {
10 name string
11 releases []release
12}
13
14func NewChangelog(name string) *changelog {
15 return &changelog{
16 name: name,
17 releases: make([]release, 0),
18 }
19}
20
21func (c *changelog) NewRelease(version, url, notes string) {
22 if latest := c.Latest(); latest != nil {
23 latest.isLatest = false
24 }
25
26 release := release{
27 // manual
28 version: version,
29 url: url,
30 notes: notes,
31
32 // internal
33 changelog: c,
34 isLatest: true,
35 }
36
37 c.releases = append(c.releases, release)
38}
39
40func (c changelog) RenderAsTable(max int) string {
41 out := md.H1(c.name)
42
43 if len(c.releases) == 0 {
44 out += "No releases."
45 return out
46 }
47
48 out += ufmt.Sprintf("See the %s changelog below.\n\n", c.name)
49 table := mdtable.Table{
50 Headers: []string{"Version", "Link", "Notes"},
51 }
52
53 if max > len(c.releases) {
54 max = len(c.releases)
55 }
56
57 for i := len(c.releases) - 1; i >= len(c.releases)-max; i-- {
58 r := c.releases[i]
59 table.Append([]string{r.version, r.Link(), r.notes})
60 }
61
62 out += table.String()
63 return out
64}
65
66func (c *changelog) Render(path string) string {
67 if path == "" {
68 output := "# " + c.name + "\n\n"
69 max := len(c.releases) - 1
70 min := 0
71 if max-min > 10 {
72 min = max - 10
73 }
74 for i := max; i >= min; i-- {
75 release := c.releases[i]
76 output += release.Render()
77 }
78 return output
79 }
80
81 release := c.ByVersion(path)
82 if release != nil {
83 return release.Render()
84 }
85
86 return "no such release"
87}
88
89func (c *changelog) Latest() *release {
90 if len(c.releases) > 0 {
91 pos := len(c.releases) - 1
92 return &c.releases[pos]
93 }
94 return nil
95}
96
97func (c *changelog) ByVersion(version string) *release {
98 for _, release := range c.releases {
99 if release.version == version {
100 return &release
101 }
102 }
103 return nil
104}