# Targets
.PHONY: all run test clean docker lint update-data

all: run

example: *.go ./cmd/example/*.go
	go build -o $@ ./cmd/example/main.go

run: example
	./example

test:
	go test -v ./...

clean:
	rm -f example blogs.json.tmp

docker:
	docker build --progress plain .

lint:
	golangci-lint run

# Refresh the vendored dataset from the BlogsURL constant in hnblogs.go, which
# is the single source of truth for the upstream location. The download lands
# on a temporary file and only replaces blogs.json once it has been checked to
# be a non-empty JSON array of blog entries, so neither an interrupted transfer
# nor a complete-but-wrong response (an error page, a redirect landing page)
# can overwrite the good dataset.
update-data:
	@command -v jq >/dev/null || { echo "update-data requires jq" >&2; exit 1; }
	@url=$$(sed -n 's/^const BlogsURL = "\(.*\)"$$/\1/p' hnblogs.go); \
	test -n "$$url" || { echo "could not parse BlogsURL from hnblogs.go" >&2; exit 1; }; \
	echo "fetching $$url"; \
	curl -fsSL "$$url" -o blogs.json.tmp
	@jq -e 'type == "array" and length > 0 and all(.[]; type == "object" and has("url"))' \
		blogs.json.tmp >/dev/null 2>&1 \
		|| { echo "download is not a non-empty JSON array of blog entries; blogs.json left unchanged" >&2; \
		     rm -f blogs.json.tmp; exit 1; }
	mv blogs.json.tmp blogs.json
	$(MAKE) test
