138 lines
3.8 KiB
Bash
Executable File
138 lines
3.8 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
REPO_ROOT="$(cd "${SCRIPT_DIR}/../../.." && pwd)"
|
|
API_DIR="${REPO_ROOT}/api"
|
|
PROTO_DIR="./proto"
|
|
PROTOC_BIN="${PROTOC:-protoc}"
|
|
GO_MODULE="github.com/tech/sendico/pkg"
|
|
GO_OUT_DIR="./pkg"
|
|
|
|
# Ensure required tools exist
|
|
if ! command -v "${PROTOC_BIN}" >/dev/null 2>&1; then
|
|
echo "[proto] protoc binary not found" >&2; exit 1
|
|
fi
|
|
if ! command -v protoc-gen-go >/dev/null 2>&1; then
|
|
echo "[proto] protoc-gen-go is not installed" >&2; exit 1
|
|
fi
|
|
if ! command -v protoc-gen-go-grpc >/dev/null 2>&1; then
|
|
echo "[proto] protoc-gen-go-grpc is not installed" >&2; exit 1
|
|
fi
|
|
|
|
info() { printf '[proto] %s\n' "$1"; }
|
|
|
|
# Try to determine the include path for well-known types (WKT) without hard failing
|
|
PROTOC_INCLUDE=""
|
|
# Prefer known locations on Alpine/Debian-like images
|
|
for cand in /usr/include /usr/local/include; do
|
|
if [ -f "$cand/google/protobuf/descriptor.proto" ]; then
|
|
PROTOC_INCLUDE="$cand"
|
|
break
|
|
fi
|
|
done
|
|
|
|
PROTOC_ARGS=""
|
|
if [ -n "${PROTOC_INCLUDE}" ]; then
|
|
PROTOC_ARGS="-I=${PROTOC_INCLUDE}"
|
|
fi
|
|
PROTOC_ARGS="${PROTOC_ARGS} -I=${PROTO_DIR}"
|
|
|
|
generate_go() {
|
|
# shellcheck disable=SC2086
|
|
"${PROTOC_BIN}" \
|
|
${PROTOC_ARGS} \
|
|
--go_out="${GO_OUT_DIR}" \
|
|
--go_opt=module="${GO_MODULE}" \
|
|
"$@"
|
|
}
|
|
|
|
generate_go_with_grpc() {
|
|
# shellcheck disable=SC2086
|
|
"${PROTOC_BIN}" \
|
|
${PROTOC_ARGS} \
|
|
--go_out="${GO_OUT_DIR}" \
|
|
--go_opt=module="${GO_MODULE}" \
|
|
--go-grpc_out="${GO_OUT_DIR}" \
|
|
--go-grpc_opt=module="${GO_MODULE}" \
|
|
"$@"
|
|
}
|
|
|
|
clean_pb_files() {
|
|
local target="$1"
|
|
if [ -d "${target}" ]; then
|
|
find "${target}" -type f -name '*.pb.go' -delete
|
|
fi
|
|
}
|
|
|
|
list_protos() {
|
|
local search_dir="$1" maxdepth="${2:-}"
|
|
if [ -n "$maxdepth" ]; then
|
|
find "${search_dir}" -maxdepth "${maxdepth}" -type f -name '*.proto' | sort
|
|
else
|
|
find "${search_dir}" -type f -name '*.proto' | sort
|
|
fi
|
|
}
|
|
|
|
cd "${API_DIR}"
|
|
|
|
messaging_files="$(list_protos "${PROTO_DIR}" 1)"
|
|
if [ -n "${messaging_files}" ]; then
|
|
info "Compiling messaging protos"
|
|
rm -rf ./pkg/generated/gmessaging ./pkg/messaging/internal/generated
|
|
set -- $messaging_files
|
|
generate_go "$@"
|
|
fi
|
|
|
|
common_files="$(list_protos "${PROTO_DIR}/common")"
|
|
if [ -n "${common_files}" ]; then
|
|
info "Compiling common shared protos"
|
|
clean_pb_files "./pkg/proto"
|
|
set -- $common_files
|
|
generate_go "$@"
|
|
fi
|
|
|
|
if [ -f "${PROTO_DIR}/ledger/v1/ledger.proto" ]; then
|
|
info "Compiling ledger protos"
|
|
clean_pb_files "./pkg/proto/ledger"
|
|
generate_go_with_grpc "${PROTO_DIR}/ledger/v1/ledger.proto"
|
|
fi
|
|
|
|
if [ -f "${PROTO_DIR}/oracle/v1/oracle.proto" ]; then
|
|
info "Compiling oracle protos"
|
|
clean_pb_files "./pkg/proto/oracle"
|
|
generate_go_with_grpc "${PROTO_DIR}/oracle/v1/oracle.proto"
|
|
fi
|
|
|
|
if [ -f "${PROTO_DIR}/gateway/chain/v1/chain.proto" ]; then
|
|
info "Compiling chain gateway protos"
|
|
clean_pb_files "./pkg/proto/gateway/chain"
|
|
generate_go_with_grpc "${PROTO_DIR}/gateway/chain/v1/chain.proto"
|
|
fi
|
|
|
|
if [ -f "${PROTO_DIR}/gateway/mntx/v1/mntx.proto" ]; then
|
|
info "Compiling Monetix gateway protos"
|
|
clean_pb_files "./pkg/proto/gateway/mntx"
|
|
generate_go_with_grpc "${PROTO_DIR}/gateway/mntx/v1/mntx.proto"
|
|
fi
|
|
|
|
if [ -f "${PROTO_DIR}/connector/v1/connector.proto" ]; then
|
|
info "Compiling connector protos"
|
|
clean_pb_files "./pkg/proto/connector"
|
|
generate_go_with_grpc "${PROTO_DIR}/connector/v1/connector.proto"
|
|
fi
|
|
|
|
if [ -f "${PROTO_DIR}/payments/orchestrator/v1/orchestrator.proto" ]; then
|
|
info "Compiling payments orchestrator protos"
|
|
clean_pb_files "./pkg/proto/payments/orchestrator"
|
|
generate_go_with_grpc "${PROTO_DIR}/payments/orchestrator/v1/orchestrator.proto"
|
|
fi
|
|
|
|
if [ -f "${PROTO_DIR}/billing/fees/v1/fees.proto" ]; then
|
|
info "Compiling billing fees protos"
|
|
clean_pb_files "./pkg/proto/billing/fees"
|
|
generate_go_with_grpc "${PROTO_DIR}/billing/fees/v1/fees.proto"
|
|
fi
|
|
|
|
info "Protobuf generation completed"
|