aboutsummaryrefslogtreecommitdiff
#!/bin/sh
set -eu

D="${XDG_DATA_HOME:-$HOME/.local/share}/doc/rfc"
PROMPT_DB="$(
	cat <<-EOF
		RFC directory does not exist:
		  $D/

		Do you want to download the files to create it?
	EOF
)"

usage() {
	cat <<-'EOF'
		Usage:
		  rfc [-w] RFC_NUMBER
		  rfc -u
		  rfc -h
	EOF
}

help() {
	cat <<-'EOF'


		Options:
		  -w            show the path to the RFC file instead of displaying
		                its contents
		  -u            update the local RFC database
		  -h, --help    show this message

		  RFC_NUMBER    the RFC id number


		Lookup the given RFC
		in $XDG_DATA_HOME/doc/rfc/ (defaults to ~/.local/share),
		and feed it into the $PAGER, akin to doing:

		  $ $PAGER $XDG_DATA_HOME/doc/rfc/rfc$RFC_NUMBER.txt

		If the $XDG_DATA_HOME/doc/rfc/ directory doesn't exist, it gets
		created it by downloading the latest RFC files and placing all .txt
		files there.


		Examples:

		  Show RFC 1234 in $PAGER:

		    $ rfc 1234


		  Print path to RFC 2222:

		    $ rfc 2222


		  Download the latest RFCs:

		    $ rfc -u
	EOF
}

view() {
	if [ -t 1 ]; then
		${PAGER:-cat}
	else
		cat
	fi
}

update() {
	rsync -avzP --delete ftp.rfc-editor.org::rfcs-text-only "$D"
	STATUS=$?
	if [ "$STATUS" != 0 ]; then
		exit "$STATUS"
	fi
}

check_local_db() {
	if [ ! -e "$D" ]; then
		if prompt "$PROMPT_DB"; then
			update
		else
			echo 'No local RFC database to operate on.' >&2
			exit 1
		fi
	fi
}


for flag in "$@"; do
	case "$flag" in
		(--)
			break
			;;
		(--help)
			usage
			help
			exit
			;;
		(*)
			;;
	esac
done

while getopts 'wuh' flag; do
	case "$flag" in
		(w)
			WHERE=true
			;;
		(u)
			UPDATE=true
			;;
		(h)
			usage
			help
			exit
			;;
		(*)
			usage >&2
			exit 2
			;;
	esac
done
shift $((OPTIND - 1))

RFC_NUMBER="${1:-}"
F="$D/rfc${RFC_NUMBER}.txt"

check_local_db

if [ "${UPDATE:-}" = true ]; then
	update
	exit
fi

eval "$(assert-arg -- "$RFC_NUMBER" 'RFC_NUMBER')"

if [ ! -e "$F" ]; then
	printf 'Given RFC_NUMBER "%s" does not exist at:\n%s\n' \
		"$RFC_NUMBER" "$F" >&2
	exit 2
fi

if [ "${WHERE:-}" = true ]; then
	printf '%s\n' "$F"
	exit
else
	view < "$F"
	exit
fi