#!/usr/bin/env bash set -euo pipefail mkdir -p internal/{server,worker,store,cli} cat > go.mod <<'EOF' module app go 1.22 EOF cat > config.go <<'EOF' package app // Cfg holds process-wide settings. type Cfg struct { Addr string Workers int DSN string } // DefaultCfg returns the built-in defaults. func DefaultCfg() Cfg { return Cfg{Addr: ":8080", Workers: 4, DSN: "file::memory:"} } EOF cat > internal/server/server.go <<'EOF' package server import "app" type Server struct{ cfg app.Cfg } func New(cfg app.Cfg) *Server { return &Server{cfg: cfg} } func (s *Server) Addr() string { return s.cfg.Addr } EOF cat > internal/worker/worker.go <<'EOF' package worker import "app" type Pool struct{ cfg app.Cfg } func NewPool(cfg app.Cfg) *Pool { return &Pool{cfg: cfg} } func (p *Pool) Size() int { return p.cfg.Workers } EOF cat > internal/store/store.go <<'EOF' package store import "app" type Store struct{ cfg app.Cfg } func Open(cfg app.Cfg) (*Store, error) { return &Store{cfg: cfg}, nil } func (s *Store) DSN() string { return s.cfg.DSN } EOF cat > internal/cli/cli.go <<'EOF' package cli import ( "flag" "app" ) // Parse builds a Cfg from command-line flags. func Parse(args []string) app.Cfg { cfg := app.DefaultCfg() fs := flag.NewFlagSet("app", flag.ContinueOnError) fs.StringVar(&cfg.Addr, "addr", cfg.Addr, "listen address") fs.IntVar(&cfg.Workers, "workers", cfg.Workers, "worker count") fs.Parse(args) return cfg } EOF cat > app_test.go <<'EOF' package app import "testing" func TestDefaults(t *testing.T) { if DefaultCfg().Workers != 4 { t.Error("bad defaults") } } EOF git init -q . && git add -A && git -c user.email=e@x -c user.name=n commit -qm base