From 455778d2db961c36c54550ed3fc02a23aeaac34b Mon Sep 17 00:00:00 2001
From: Martin Fischer <martin@push-f.com>
Date: Sun, 6 Apr 2025 21:37:32 +0200
Subject: refactor: use slog from standard library

---
 build.go | 55 ++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 38 insertions(+), 17 deletions(-)

(limited to 'build.go')

diff --git a/build.go b/build.go
index c15c8e2..4143582 100644
--- a/build.go
+++ b/build.go
@@ -7,6 +7,7 @@ import (
 	"flag"
 	"fmt"
 	"html/template"
+	"log/slog"
 	"maps"
 	"os"
 	"os/exec"
@@ -16,7 +17,6 @@ import (
 	"strings"
 
 	"github.com/BurntSushi/toml"
-	log "github.com/sirupsen/logrus"
 )
 
 const caniuseRepoURL = "https://github.com/jplatte/caniuse.rs"
@@ -36,7 +36,10 @@ var style []byte
 //go:embed find-lib-feats.sh
 var findLibFeatsShellCommand string
 
+var log *slog.Logger
+
 func main() {
+	log = slog.New(slog.NewTextHandler(os.Stderr, nil))
 	caniuseRepo := "caniuse.rs"
 	rustRepo := "rust"
 	outDir := "out"
@@ -65,7 +68,8 @@ func main() {
 	cmd.Stderr = &stderr
 	libFeaturesText, err := cmd.Output()
 	if err != nil {
-		log.WithField("stderr", stderr.String()).Fatalf("failed to run shell command to find library features: %s", err)
+		log.Error("failed to run shell command to find library features", Error(err), "stderr", stderr.String())
+		os.Exit(1)
 	}
 	libFeatureFlags := strings.Split(string(libFeaturesText), "\n")
 
@@ -73,11 +77,13 @@ func main() {
 	versionsPath := fmt.Sprintf(caniuseRepo + "/data/versions.toml")
 	_, err = toml.DecodeFile(versionsPath, &versionInfos)
 	if err != nil {
-		log.Fatalf("error parsing %s: %s", versionsPath, err)
+		log.Error("failed to parse versions.toml", Error(err), "path", versionsPath)
+		os.Exit(1)
 	}
 
 	if len(versionInfos) == 0 {
-		log.Fatal("found no versions in versions.toml")
+		log.Error("found no versions in versions.toml")
+		os.Exit(1)
 	}
 
 	versions := make([]Version, 0)
@@ -113,7 +119,8 @@ func main() {
 	}
 
 	if featureCount == 0 {
-		log.Fatal("found no features")
+		log.Error("found no features")
+		os.Exit(1)
 	}
 
 	tmpl := template.New("template.html.tmpl").Funcs(template.FuncMap{
@@ -129,17 +136,20 @@ func main() {
 	tmpl, err = tmpl.Parse(templateText)
 
 	if err != nil {
-		log.Fatalf("error parsing template: %s", err)
+		log.Error("error parsing template", Error(err))
+		os.Exit(1)
 	}
 
 	err = os.MkdirAll(outDir, 0o755)
 	if err != nil {
-		log.Fatalf("error creating directory: %s", err)
+		log.Error("error creating output directory", Error(err))
+		os.Exit(1)
 	}
 
 	outputFile, err := os.Create(outDir + "/index.html")
 	if err != nil {
-		log.Fatalf("error creating index.html: %s", err)
+		log.Error("error creating index.html", Error(err))
+		os.Exit(1)
 	}
 	defer outputFile.Close()
 
@@ -150,29 +160,34 @@ func main() {
 		},
 	)
 	if err != nil {
-		log.Fatalf("error executing template: %s", err)
+		log.Error("error executing template", Error(err))
+		os.Exit(1)
 	}
 
 	outputFile, err = os.Create(outDir + "/data.json")
 	if err != nil {
-		log.Fatalf("error creating data.json: %s", err)
+		log.Error("error creating data.json", Error(err))
+		os.Exit(1)
 	}
 	defer outputFile.Close()
 
 	encoder := json.NewEncoder(outputFile)
 	err = encoder.Encode(versions)
 	if err != nil {
-		log.Fatalf("error encoding JSON: %s", err)
+		log.Error("error encoding JSON", Error(err))
+		os.Exit(1)
 	}
 
 	err = os.WriteFile(outDir+"/script.js", script, 0o644)
 	if err != nil {
-		log.Fatalf("error creating script.js: %s", err)
+		log.Error("error creating script.js", Error(err))
+		os.Exit(1)
 	}
 
 	err = os.WriteFile(outDir+"/style.css", style, 0o644)
 	if err != nil {
-		log.Fatalf("error creating style.css: %s", err)
+		log.Error("error creating style.css", Error(err))
+		os.Exit(1)
 	}
 }
 
@@ -207,16 +222,19 @@ func getFeatures(caniuseRepo string, version string) map[string]Feature {
 		if os.IsNotExist(err) {
 			return nil
 		}
-		log.Fatal(err)
+		log.Error("failed to read directory", "path", dirPath, Error(err))
+		os.Exit(1)
 	}
 
 	features := make(map[string]Feature)
 
 	for _, entry := range entries {
 		var feature Feature
-		_, err := toml.DecodeFile(dirPath+"/"+entry.Name(), &feature)
+		path := dirPath + "/" + entry.Name()
+		_, err := toml.DecodeFile(path, &feature)
 		if err != nil {
-			log.Fatalf("Error parsing %s: %s\n", dirPath+entry.Name(), err)
+			log.Error("error decoding TOML file", "path", path, Error(err))
+			os.Exit(1)
 		}
 		if feature.TrackingIssueId != nil {
 			feature.URL = fmt.Sprintf("https://github.com/rust-lang/rust/issues/%d", *feature.TrackingIssueId)
@@ -276,7 +294,8 @@ func runCommand(name string, args ...string) {
 	var stderr bytes.Buffer
 	cmd.Stderr = &stderr
 	if err := cmd.Run(); err != nil {
-		log.WithField("stderr", stderr.String()).Fatalf("command '%s %v' failed: %v", name, args, err)
+		log.Error("failed to run command", "command", cmd.String(), Error(err), "stderr", stderr.String())
+		os.Exit(1)
 	}
 }
 
@@ -284,3 +303,5 @@ func runCommand(name string, args ...string) {
 func nilAsEmptyArray[T any](slice []T) []T {
 	return append([]T{}, slice...)
 }
+
+func Error(value error) slog.Attr { return slog.String("error", value.Error()) }
-- 
cgit v1.2.3