65 lines
1.2 KiB
Bash
Executable File
65 lines
1.2 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -eu -o pipefail
|
|
|
|
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
|
proto_dir="${SCRIPT_DIR}"/../generated_types/protos
|
|
|
|
usage() {
|
|
echo "usage: $0 { types | decode <message_type> | encode <message_type> }"
|
|
exit 1
|
|
}
|
|
|
|
protoc() {
|
|
# bash 3.x (default on macos big-sur 🤦) has no readarray.
|
|
while IFS= read -r line; do
|
|
proto_flags+=("$line")
|
|
done < <(find "${proto_dir}" -name '*.proto')
|
|
|
|
command protoc -I"${proto_dir}" "${proto_flags[@]}" "$@"
|
|
}
|
|
|
|
types() {
|
|
while read -r proto <&3; do
|
|
pkg=$(grep '^package' "${proto}" | sed 's/package \(.*\);.*/\1/')
|
|
while read -r message <&4; do
|
|
echo "${pkg}.${message}"
|
|
done 4< <(grep '^message ' "${proto}" | sed 's/message \(.*\) {.*/\1/')
|
|
done 3< <(find "${proto_dir}" -name '*.proto')
|
|
}
|
|
|
|
decode() {
|
|
if [ -z "${1:-}" ]; then
|
|
echo >&2 "WARNING: Pass a message type to render field names. Command '$0 types' lists valid types."
|
|
echo >&2
|
|
command protoc --decode_raw
|
|
else
|
|
protoc --decode="$1"
|
|
fi
|
|
}
|
|
|
|
encode() {
|
|
if [ -z "${1:-}" ]; then
|
|
usage
|
|
fi
|
|
protoc --encode="$1"
|
|
}
|
|
|
|
case $1 in
|
|
types)
|
|
shift
|
|
types "$@"
|
|
;;
|
|
decode)
|
|
shift
|
|
decode "$@"
|
|
;;
|
|
encode)
|
|
shift
|
|
encode "$@"
|
|
;;
|
|
*)
|
|
usage
|
|
;;
|
|
esac
|