Add a script to query the API
Add a simple script that allows one to query the current API. Done by parsing the API text files and grepping for things. This is useful as a dev tool as we try to stabalize the leaf crates.
This commit is contained in:
parent
e126a24307
commit
7e0501c03c
|
@ -0,0 +1,149 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
#
|
||||||
|
# Script for querying the API.
|
||||||
|
#
|
||||||
|
# Shellcheck can't search dynamic paths
|
||||||
|
# shellcheck source=/dev/null
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
file="" # File name of the all-features API text file.
|
||||||
|
crate_full_name="" # Full crate name using underscores e.g., `bitcoin_primitives`.
|
||||||
|
crate="" # Short name e.g., `primitives`.
|
||||||
|
|
||||||
|
# Set to false to turn off verbose output.
|
||||||
|
flag_verbose=false
|
||||||
|
|
||||||
|
usage() {
|
||||||
|
cat <<EOF
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
./api.sh CRATE COMMAND
|
||||||
|
|
||||||
|
CRATE
|
||||||
|
- hashes bitcoin_hashes
|
||||||
|
- io bitcoin-io
|
||||||
|
- primitives bitcoin-primitives
|
||||||
|
- units bitcoin-units
|
||||||
|
|
||||||
|
CMD
|
||||||
|
- types Show all public types (structs and enums)
|
||||||
|
- types_no_err Show all public types (structs and enums) excluding error types.
|
||||||
|
EOF
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
if [ "$#" -lt 1 ]; then
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local _crate="${1:---help}"
|
||||||
|
if [[ "$_crate" == "-h" || "$_crate" == "--help" ]]; then
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$#" -lt 2 ]; then
|
||||||
|
say_err "Missing COMMAND"
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
local _cmd="$2"
|
||||||
|
|
||||||
|
check_required_commands
|
||||||
|
|
||||||
|
case $_crate in
|
||||||
|
hashes)
|
||||||
|
crate_full_name="bitcoin_hashes"
|
||||||
|
;;
|
||||||
|
io)
|
||||||
|
crate_full_name="bitcoin_io"
|
||||||
|
;;
|
||||||
|
primitives)
|
||||||
|
crate_full_name="bitcoin_primitives"
|
||||||
|
;;
|
||||||
|
units)
|
||||||
|
crate_full_name="bitcoin_units"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
say_err "unsupported crate: $_crate"
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
esac
|
||||||
|
|
||||||
|
crate=$_crate
|
||||||
|
file="./api/$crate/all-features.txt"
|
||||||
|
|
||||||
|
verbose_say "Running command '$_cmd' on crate '$crate'"
|
||||||
|
|
||||||
|
case $_cmd in
|
||||||
|
types)
|
||||||
|
structs_and_enums
|
||||||
|
;;
|
||||||
|
|
||||||
|
types_no_err)
|
||||||
|
structs_and_enums_no_err
|
||||||
|
;;
|
||||||
|
|
||||||
|
traits)
|
||||||
|
traits
|
||||||
|
;;
|
||||||
|
|
||||||
|
*)
|
||||||
|
err "Error: unknown cmd $_cmd"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
# Print all public structs and enums.
|
||||||
|
structs_and_enums() {
|
||||||
|
grep -oP 'pub (struct|enum) \K[\w:]+(?=\(|;| )' "$file" | sed "s/^${crate_full_name}:://"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Print all public structs and enums excluding error types.
|
||||||
|
structs_and_enums_no_err() {
|
||||||
|
grep -oP 'pub (struct|enum) \K[\w:]+(?=\(|;| )' "$file" | sed "s/^${crate_full_name}:://" | grep -v Error
|
||||||
|
}
|
||||||
|
|
||||||
|
# Print all public traits.
|
||||||
|
traits() {
|
||||||
|
grep -oP '^pub trait \K[\w:]+' "$file" | sed "s/^${crate_full_name}:://" | sed 's/:$//'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Check all the commands we use are present in the current environment.
|
||||||
|
check_required_commands() {
|
||||||
|
need_cmd grep
|
||||||
|
}
|
||||||
|
|
||||||
|
say() {
|
||||||
|
echo "api: $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
say_err() {
|
||||||
|
say "$1" >&2
|
||||||
|
}
|
||||||
|
|
||||||
|
verbose_say() {
|
||||||
|
if [ "$flag_verbose" = true ]; then
|
||||||
|
say "$1"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
err() {
|
||||||
|
echo "$1" >&2
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
need_cmd() {
|
||||||
|
if ! command -v "$1" > /dev/null 2>&1
|
||||||
|
then err "need '$1' (command not found)"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
#
|
||||||
|
# Main script
|
||||||
|
#
|
||||||
|
main "$@"
|
||||||
|
exit 0
|
6
justfile
6
justfile
|
@ -1,3 +1,5 @@
|
||||||
|
set positional-arguments
|
||||||
|
|
||||||
default:
|
default:
|
||||||
@just --list
|
@just --list
|
||||||
|
|
||||||
|
@ -40,6 +42,10 @@ sane: lint
|
||||||
check-api:
|
check-api:
|
||||||
contrib/check-for-api-changes.sh
|
contrib/check-for-api-changes.sh
|
||||||
|
|
||||||
|
# Query the current API.
|
||||||
|
@query-api crate command:
|
||||||
|
contrib/api.sh $1 $2
|
||||||
|
|
||||||
# Update the recent and minimal lock files.
|
# Update the recent and minimal lock files.
|
||||||
update-lock-files:
|
update-lock-files:
|
||||||
contrib/update-lock-files.sh
|
contrib/update-lock-files.sh
|
||||||
|
|
Loading…
Reference in New Issue