106 lines
2.2 KiB
Bash
Executable File
106 lines
2.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
blob_bin_dir="$(cd "$(dirname "$(readlink -f "${BASH_SOURCE[0]}")")" && pwd)"
|
|
|
|
command_file() {
|
|
local name="$1"
|
|
if [[ -x "$blob_bin_dir/$name" ]]; then
|
|
printf '%s\n' "$blob_bin_dir/$name"
|
|
else
|
|
command -v "$name" 2>/dev/null
|
|
fi
|
|
}
|
|
|
|
resolve_command() {
|
|
local words=("$@")
|
|
local word_count=${#words[@]}
|
|
local words_used name joined
|
|
for (( words_used = word_count; words_used > 0; words_used-- )); do
|
|
joined=$(printf '%s-' "${words[@]:0:words_used}")
|
|
name="blob-${joined%-}"
|
|
if [[ -n $(command_file "$name") ]]; then
|
|
printf '%s %s\n' "$words_used" "$name"
|
|
return 0
|
|
fi
|
|
done
|
|
return 1
|
|
}
|
|
|
|
metadata_value() {
|
|
sed -n "s/^# blob:$2=//p" "$1" | head -1
|
|
}
|
|
|
|
is_hidden() {
|
|
grep -q '^# blob:hidden=true' "$1" 2>/dev/null
|
|
}
|
|
|
|
list_commands() {
|
|
local file base summary
|
|
for file in "$blob_bin_dir"/blob-*; do
|
|
[[ -f $file ]] || continue
|
|
is_hidden "$file" && continue
|
|
base=$(basename "$file")
|
|
summary=$(metadata_value "$file" summary)
|
|
printf ' %-28s %s\n' "${base#blob-}" "$summary"
|
|
done
|
|
}
|
|
|
|
show_command_help() {
|
|
local name="$1"
|
|
local file
|
|
file=$(command_file "$name")
|
|
printf '%s\n' "$(metadata_value "$file" summary)"
|
|
local args
|
|
args=$(metadata_value "$file" args)
|
|
printf '\nUsage: %s %s\n' "${name//-/ }" "$args"
|
|
local examples
|
|
examples=$(metadata_value "$file" examples)
|
|
[[ -n $examples ]] && printf '\nExample: %s\n' "$examples"
|
|
return 0
|
|
}
|
|
|
|
show_usage() {
|
|
cat <<USAGE
|
|
Usage: blob <command> [args...]
|
|
|
|
Commands are files named blob-<area>-<verb>. Both forms work:
|
|
|
|
blob theme set tokyo-night
|
|
blob-theme-set tokyo-night
|
|
|
|
Available commands:
|
|
USAGE
|
|
list_commands
|
|
printf '\nRun "blob help <command>" for details on one.\n'
|
|
}
|
|
|
|
case "${1-}" in
|
|
"" | help | --help | -h)
|
|
shift || true
|
|
if (( $# == 0 )); then
|
|
show_usage
|
|
exit 0
|
|
fi
|
|
if resolution=$(resolve_command "$@"); then
|
|
show_command_help "${resolution#* }"
|
|
exit 0
|
|
fi
|
|
echo "Unknown command: $*" >&2
|
|
exit 1
|
|
;;
|
|
esac
|
|
|
|
if ! resolution=$(resolve_command "$@"); then
|
|
echo "Unknown command: $*" >&2
|
|
echo 'Run "blob" to list commands.' >&2
|
|
exit 1
|
|
fi
|
|
|
|
words_used="${resolution%% *}"
|
|
command_name="${resolution#* }"
|
|
shift "$words_used"
|
|
|
|
exec "$(command_file "$command_name")" "$@"
|