github.com/gnolang/gno@v0.0.0-20240520182011-228e9d0192ce/examples/gno.land/p/demo/releases/changelog.gno (about) 1 package releases 2 3 type changelog struct { 4 name string 5 releases []release 6 } 7 8 func NewChangelog(name string) *changelog { 9 return &changelog{ 10 name: name, 11 releases: make([]release, 0), 12 } 13 } 14 15 func (c *changelog) NewRelease(version, url, notes string) { 16 if latest := c.Latest(); latest != nil { 17 latest.isLatest = false 18 } 19 20 release := release{ 21 // manual 22 version: version, 23 url: url, 24 notes: notes, 25 26 // internal 27 changelog: c, 28 isLatest: true, 29 } 30 31 c.releases = append(c.releases, release) 32 } 33 34 func (c *changelog) Render(path string) string { 35 if path == "" { 36 output := "# " + c.name + "\n\n" 37 max := len(c.releases) - 1 38 min := 0 39 if max-min > 10 { 40 min = max - 10 41 } 42 for i := max; i >= min; i-- { 43 release := c.releases[i] 44 output += release.Render() 45 } 46 return output 47 } 48 49 release := c.ByVersion(path) 50 if release != nil { 51 return release.Render() 52 } 53 54 return "no such release" 55 } 56 57 func (c *changelog) Latest() *release { 58 if len(c.releases) > 0 { 59 pos := len(c.releases) - 1 60 return &c.releases[pos] 61 } 62 return nil 63 } 64 65 func (c *changelog) ByVersion(version string) *release { 66 for _, release := range c.releases { 67 if release.version == version { 68 return &release 69 } 70 } 71 return nil 72 }