#!/usr/bin/env bash
set -euo pipefail
cat > go.mod <<'EOF'
module semver
go 1.22
EOF
cat > semver.go <<'EOF'
// Package semver parses and compares simple semantic versions.
package semver
import (
"fmt"
"strconv"
"strings"
)
// Version is a major.minor.patch triple.
type Version struct {
Major, Minor, Patch int
}
// Parse reads a version of the form "1.2.3", with an optional leading "v".
func Parse(s string) (Version, error) {
s = strings.TrimPrefix(strings.TrimSpace(s), "v")
parts := strings.Split(s, ".")
if len(parts) != 3 {
return Version{}, fmt.Errorf("semver: %q has %d parts, want 3", s, len(parts))
}
var v Version
for i, dst := range []*int{&v.Major, &v.Minor, &v.Patch} {
n, err := strconv.Atoi(parts[i])
if err != nil {
return Version{}, fmt.Errorf("semver: %q: %w", s, err)
}
if n < 0 {
return Version{}, fmt.Errorf("semver: %q has a negative component", s)
}
*dst = n
}
return v, nil
}
// Compare returns -1, 0 or 1 as a sorts before, equal to, or after b.
func Compare(a, b Version) int {
for _, pair := range [][2]int{{a.Major, b.Major}, {a.Minor, b.Minor}, {a.Patch, b.Patch}} {
switch {
case pair[0] < pair[1]:
return -1
case pair[0] > pair[1]:
return 1
}
}
return 0
}
// String renders the version.
func (v Version) String() string { return fmt.Sprintf("%d.%d.%d", v.Major, v.Minor, v.Patch) }
EOF
git init -q . && git add -A && git -c user.email=e@x -c user.name=n commit -qm base