Vectrum
Sign In
60 lines · 1.4 KB · Shell
#!/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