#!/usr/bin/env bash set -euo pipefail cat > go.mod <<'EOF' module conf go 1.22 EOF cat > conf.go <<'EOF' package conf import ( "encoding/json" "os" ) // Settings is the on-disk configuration. type Settings struct { Name string `json:"name"` Retries int `json:"retries"` } // Load reads settings from path. func Load(path string) Settings { data, _ := os.ReadFile(path) var s Settings json.Unmarshal(data, &s) return s } EOF cat > main_helper.go <<'EOF' package conf // Describe summarises the settings at path. func Describe(path string) string { s := Load(path) return s.Name } EOF cat > conf_test.go <<'EOF' package conf import ( "os" "path/filepath" "testing" ) func TestLoadValid(t *testing.T) { dir := t.TempDir() p := filepath.Join(dir, "c.json") os.WriteFile(p, []byte(`{"name":"svc","retries":3}`), 0o644) s, err := Load(p) if err != nil { t.Fatalf("Load: %v", err) } if s.Name != "svc" || s.Retries != 3 { t.Errorf("got %+v", s) } } func TestLoadMissingFile(t *testing.T) { if _, err := Load(filepath.Join(t.TempDir(), "nope.json")); err == nil { t.Error("want an error for a missing file") } } func TestLoadBadJSON(t *testing.T) { dir := t.TempDir() p := filepath.Join(dir, "c.json") os.WriteFile(p, []byte(`{not json`), 0o644) if _, err := Load(p); err == nil { t.Error("want an error for malformed JSON") } } EOF git init -q . && git add -A && git -c user.email=e@x -c user.name=n commit -qm base