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  }