11#! /usr/bin/env bash
22set -euo pipefail
33
4+ # dev — idpishield developer toolkit
5+ # Usage: dev [command] Run a command directly
6+ # dev Show help
7+
48cd " $( dirname " $0 " ) "
59
610BOLD=$' \033 [1m'
@@ -10,129 +14,101 @@ SUCCESS=$'\033[38;2;0;229;204m'
1014ERROR=$' \033 [38;2;230;57;70m'
1115NC=$' \033 [0m'
1216
13- commands=(
17+ # ── Commands ─────────────────────────────────────────────────────────
18+ COMMANDS=(
19+ " build:📦:Build binary"
20+ " check:✅:All checks (format, vet, build, lint)"
21+ " test:🧪:Run tests"
1422 " doctor:🩺:Setup dev environment"
15- " test:🧪:Run unit tests"
16- " test verbose:🧪:Run unit tests (verbose)"
17- " test race:🧪:Run unit tests with race detector"
18- " coverage:📊:Run tests with coverage report"
19- " lint:🔍:Run golangci-lint"
2023 " fmt:✨:Format code"
2124 " vet:🔬:Run go vet"
22- " check:✅ :Run all checks (fmt + vet + lint + test) "
23- " build:📦:Build CLI binary "
25+ " lint:🔍 :Run golangci- lint"
26+ " coverage:📊:Run tests with coverage "
2427 " benchmark:🏋:Run benchmarks"
2528)
2629
2730show_help () {
2831 echo " "
29- echo " ${BOLD}${ ACCENT} idpishield ${NC} ${MUTED} — development tool ${NC} "
32+ echo " ${ACCENT}${BOLD} 🛡️ idpishield Dev ${NC} "
3033 echo " "
31- for entry in " ${commands [@]} " ; do
32- IFS=: read -r cmd icon desc <<< " $entry "
33- printf " ${ACCENT} %-22s ${NC} %s %s \n" " ./dev $cmd " " $icon " " $desc "
34+ for cmd in " ${COMMANDS [@]} " ; do
35+ IFS=' : ' read -r name emoji desc <<< " $cmd "
36+ printf " ${SUCCESS} %s ${NC} ${BOLD} %-12s ${NC} ${MUTED} %s ${NC} \n" " $emoji " " $name " " $desc "
3437 done
3538 echo " "
36- }
37-
38- run_test () {
39- echo " ${ACCENT}${BOLD} 🧪 Running tests${NC} "
40- go test ./... -count=1
41- echo " ${SUCCESS} ✓${NC} Tests passed"
42- }
43-
44- run_test_verbose () {
45- echo " ${ACCENT}${BOLD} 🧪 Running tests (verbose)${NC} "
46- go test ./... -count=1 -v
47- }
48-
49- run_test_race () {
50- echo " ${ACCENT}${BOLD} 🧪 Running tests with race detector${NC} "
51- go test ./... -count=1 -race
52- echo " ${SUCCESS} ✓${NC} Tests passed (race)"
53- }
54-
55- run_coverage () {
56- echo " ${ACCENT}${BOLD} 📊 Running tests with coverage${NC} "
57- go test ./... -count=1 -coverprofile=coverage.out -covermode=atomic
58- go tool cover -func=coverage.out | tail -1
39+ echo " ${MUTED} Usage: ./dev [command]${NC} "
5940 echo " "
60- echo " ${MUTED} HTML report: go tool cover -html=coverage.out${NC} "
6141}
6242
63- run_lint () {
64- echo " ${ACCENT}${BOLD} 🔍 Running linter${NC} "
65- golangci-lint run
66- echo " ${SUCCESS} ✓${NC} Lint clean"
67- }
43+ run_command () {
44+ local target=" $1 "
6845
69- run_fmt () {
70- echo " ${ACCENT}${BOLD} ✨ Formatting code${NC} "
71- gofmt -w .
72- echo " ${SUCCESS} ✓${NC} Formatted"
73- }
74-
75- run_vet () {
76- echo " ${ACCENT}${BOLD} 🔬 Running go vet${NC} "
77- go vet ./...
78- echo " ${SUCCESS} ✓${NC} Vet clean"
79- }
80-
81- run_check () {
82- echo " ${ACCENT}${BOLD} ✅ Running all checks${NC} "
8346 echo " "
8447
85- echo " ${MUTED} 1/4 Format check${NC} "
86- unformatted=$( gofmt -l .)
87- if [ -n " $unformatted " ]; then
88- echo " ${ERROR} ✗${NC} Unformatted files:"
89- echo " $unformatted "
90- exit 1
91- fi
92- echo " ${SUCCESS} ✓${NC} Format"
93-
94- echo " ${MUTED} 2/4 Vet${NC} "
95- go vet ./...
96- echo " ${SUCCESS} ✓${NC} Vet"
97-
98- echo " ${MUTED} 3/4 Lint${NC} "
99- golangci-lint run
100- echo " ${SUCCESS} ✓${NC} Lint"
101-
102- echo " ${MUTED} 4/4 Tests${NC} "
103- go test ./... -count=1 -race
104- echo " ${SUCCESS} ✓${NC} Tests"
105-
106- echo " "
107- echo " ${SUCCESS}${BOLD} All checks passed${NC} "
48+ case " $target " in
49+ " build" )
50+ echo " ${ACCENT}${BOLD} 📦 Building idpishield${NC} "
51+ echo " "
52+ go build -o idpishield ./cmd/idpishield
53+ echo " ${SUCCESS} ✓${NC} Built: ./idpishield"
54+ ;;
55+ " check" )
56+ exec bash scripts/check.sh
57+ ;;
58+ " test" )
59+ exec bash scripts/test.sh
60+ ;;
61+ " doctor" )
62+ exec bash scripts/doctor.sh
63+ ;;
64+ " fmt" )
65+ echo " ${ACCENT}${BOLD} ✨ Formatting code${NC} "
66+ echo " "
67+ gofmt -w .
68+ echo " ${SUCCESS} ✓${NC} Formatted"
69+ ;;
70+ " vet" )
71+ echo " ${ACCENT}${BOLD} 🔬 Running go vet${NC} "
72+ echo " "
73+ go vet ./...
74+ echo " ${SUCCESS} ✓${NC} Vet clean"
75+ ;;
76+ " lint" )
77+ echo " ${ACCENT}${BOLD} 🔍 Running linter${NC} "
78+ echo " "
79+ golangci-lint run
80+ echo " ${SUCCESS} ✓${NC} Lint clean"
81+ ;;
82+ " coverage" )
83+ echo " ${ACCENT}${BOLD} 📊 Running tests with coverage${NC} "
84+ echo " "
85+ go test ./... -count=1 -coverprofile=coverage.out -covermode=atomic
86+ go tool cover -func=coverage.out | tail -1
87+ echo " "
88+ echo " ${MUTED} HTML report: go tool cover -html=coverage.out${NC} "
89+ ;;
90+ " benchmark" )
91+ echo " ${ACCENT}${BOLD} 🏋 Running benchmarks${NC} "
92+ echo " "
93+ go test ./benchmark/ -count=1 -v
94+ ;;
95+ * )
96+ echo " ${ERROR} Unknown command: $target ${NC} "
97+ show_help
98+ exit 1
99+ ;;
100+ esac
108101}
109102
110- run_build () {
111- echo " ${ACCENT}${BOLD} 📦 Building CLI${NC} "
112- go build -o idpishield ./cmd/idpishield
113- echo " ${SUCCESS} ✓${NC} Built: ./idpishield"
114- }
103+ # ── Main ─────────────────────────────────────────────────────────────
115104
116- run_benchmark () {
117- echo " ${ACCENT}${BOLD} 🏋 Running benchmarks${NC} "
118- go test ./benchmark/ -count=1 -v
119- }
105+ if [ $# -gt 0 ]; then
106+ case " $1 " in
107+ -h|--help|help) show_help; exit 0 ;;
108+ * ) run_command " $1 " ;;
109+ esac
110+ exit 0
111+ fi
120112
121- case " ${1:- help} " in
122- doctor) exec bash scripts/doctor.sh ;;
123- test)
124- case " ${2:- } " in
125- verbose) run_test_verbose ;;
126- race) run_test_race ;;
127- * ) run_test ;;
128- esac
129- ;;
130- coverage) run_coverage ;;
131- lint) run_lint ;;
132- fmt) run_fmt ;;
133- vet) run_vet ;;
134- check) run_check ;;
135- build) run_build ;;
136- benchmark) run_benchmark ;;
137- help|* ) show_help ;;
138- esac
113+ # No args → show help
114+ show_help
0 commit comments