Vectrum
Sign In
87 lines · 1.7 KB · Shell
#!/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