diff --git a/ci/scripts/proto/generate.sh b/ci/scripts/proto/generate.sh index 8bde9ee..0e62877 100755 --- a/ci/scripts/proto/generate.sh +++ b/ci/scripts/proto/generate.sh @@ -6,6 +6,8 @@ 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 @@ -30,33 +32,29 @@ for cand in /usr/include /usr/local/include; do fi done -# Build an include-array only when non-empty -PROTOC_I=() +PROTOC_ARGS="" if [ -n "${PROTOC_INCLUDE}" ]; then - PROTOC_I+=("-I=${PROTOC_INCLUDE}") + PROTOC_ARGS="-I=${PROTOC_INCLUDE}" fi -# Always include our proto tree -PROTOC_I+=("-I=${PROTO_DIR}") +PROTOC_ARGS="${PROTOC_ARGS} -I=${PROTO_DIR}" generate_go() { - local out_dir="$1"; shift - mkdir -p "${out_dir}" + # shellcheck disable=SC2086 "${PROTOC_BIN}" \ - "${PROTOC_I[@]}" \ - --go_out="${out_dir}" \ - --go_opt=paths=source_relative \ + ${PROTOC_ARGS} \ + --go_out="${GO_OUT_DIR}" \ + --go_opt=module="${GO_MODULE}" \ "$@" } generate_go_with_grpc() { - local out_dir="$1"; shift - mkdir -p "${out_dir}" + # shellcheck disable=SC2086 "${PROTOC_BIN}" \ - "${PROTOC_I[@]}" \ - --go_out="${out_dir}" \ - --go_opt=paths=source_relative \ - --go-grpc_out="${out_dir}" \ - --go-grpc_opt=paths=source_relative \ + ${PROTOC_ARGS} \ + --go_out="${GO_OUT_DIR}" \ + --go_opt=module="${GO_MODULE}" \ + --go-grpc_out="${GO_OUT_DIR}" \ + --go-grpc_opt=module="${GO_MODULE}" \ "$@" } @@ -67,57 +65,61 @@ clean_pb_files() { 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 (top-level .proto files in ./proto) -mapfile -t messaging_protos < <(find "${PROTO_DIR}" -maxdepth 1 -type f -name '*.proto' | sort) -if [ "${#messaging_protos[@]}" -gt 0 ]; then +messaging_files="$(list_protos "${PROTO_DIR}" 1)" +if [ -n "${messaging_files}" ]; then info "Compiling messaging protos" - rm -rf ./pkg/messaging/internal/generated - generate_go "./pkg/messaging/internal/generated" "${messaging_protos[@]}" + rm -rf ./pkg/generated/gmessaging ./pkg/messaging/internal/generated + set -- $messaging_files + generate_go "$@" fi -# Common shared -mapfile -t common_protos < <(find "${PROTO_DIR}/common" -type f -name '*.proto' | sort) -if [ "${#common_protos[@]}" -gt 0 ]; then +common_files="$(list_protos "${PROTO_DIR}/common")" +if [ -n "${common_files}" ]; then info "Compiling common shared protos" clean_pb_files "./pkg/proto" - generate_go "./pkg/proto" "${common_protos[@]}" + set -- $common_files + generate_go "$@" fi -# Ledger if [ -f "${PROTO_DIR}/ledger/v1/ledger.proto" ]; then info "Compiling ledger protos" clean_pb_files "./pkg/proto/ledger" - generate_go_with_grpc "./pkg/proto/ledger/v1" "${PROTO_DIR}/ledger/v1/ledger.proto" + generate_go_with_grpc "${PROTO_DIR}/ledger/v1/ledger.proto" fi -# Oracle if [ -f "${PROTO_DIR}/oracle/v1/oracle.proto" ]; then info "Compiling oracle protos" clean_pb_files "./pkg/proto/oracle" - generate_go_with_grpc "./pkg/proto/oracle/v1" "${PROTO_DIR}/oracle/v1/oracle.proto" + generate_go_with_grpc "${PROTO_DIR}/oracle/v1/oracle.proto" fi -# Chain gateway if [ -f "${PROTO_DIR}/chain/gateway/v1/gateway.proto" ]; then info "Compiling chain gateway protos" clean_pb_files "./pkg/proto/chain/gateway" - generate_go_with_grpc "./pkg/proto/chain/gateway/v1" "${PROTO_DIR}/chain/gateway/v1/gateway.proto" + generate_go_with_grpc "${PROTO_DIR}/chain/gateway/v1/gateway.proto" fi -# Payments orchestrator 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 "./pkg/proto/payments/orchestrator/v1" "${PROTO_DIR}/payments/orchestrator/v1/orchestrator.proto" + generate_go_with_grpc "${PROTO_DIR}/payments/orchestrator/v1/orchestrator.proto" fi -# Billing fees 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 "./pkg/proto/billing/fees/v1" "${PROTO_DIR}/billing/fees/v1/fees.proto" + generate_go_with_grpc "${PROTO_DIR}/billing/fees/v1/fees.proto" fi info "Protobuf generation completed"