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