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}