#!/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