RussianInvestments / investAPI

117 stars 16 forks source link

gRPC генерирует namespace "public" на с++ #11

Open p977ac opened 1 year ago

p977ac commented 1 year ago

По обращению @yelowt

Добрый день! При генерации с++ кода по investAPI proto файлам package tinkoff.public.invest.api.contract.v1; генерирует namespace public. Полученный код не собирается. Естественно, при коррекции package tinkoff.invest.api.contract.v1; Код собирается, но такая удаленная процедура UNIMPLEMENTED.

Комментарии:

  1. Попробуем закинуть pull request в репозиторий grpc-cpp генератора, по пока в качестве временной меры попробуйте удалить из сгенерированного кода упоминания ::public и namespace public

  2. В качестве временного решения можно использовать автозамену namespace public на namespace public_ и ::public на ::public_ в сгенерированных файлах. Например, с помощью команды в каталоге с этими файлами:

sed -i '' 's/namespace public/namespace public_/g; s/::public/::public_/g' *.pb.* 

Автозамена потребуется после каждой генерации файлов.

  1. Аналогичная проблема, но с QtProtobuf. Автоматизировать, пока рано. Делаю замену в .proto файлах с package tinkoff.public.invest.api.contract.v1; на package tinkoff.api; В сгенерированных исходниках прописываю автозаменой по всем нужный путь к методам по апи. С чисто плюсовой версией приходится править все руками. Есть идея сгенерить на чистый С, и под него уже обертку на плюсах написать, но еще не пробовал. Ну и REST, как в v1, на крайний случай.

  2. Вопрос в protocolbuffers закинули, будет здорово, если тоже отметитесь там https://github.com/protocolbuffers/protobuf/issues/9058

0x0badc0de commented 1 year ago

Мой колхоз для пункта 2 на cmake:

change_namespace.cmake:

file(READ "${SOURCE}" TEXT)
string(REPLACE "tinkoff::public::invest::api::contract::v1" "tinkoff::public_::invest::api::contract::v1" TEXT "${TEXT}")
string(REPLACE "namespace public" "namespace public_" TEXT "${TEXT}")
file(WRITE "${TARGET}" "${TEXT}")

CMakeLists.txt:

...
find_package(Protobuf CONFIG REQUIRED)
find_package(gRPC CONFIG REQUIRED)

include(FetchContent)
FetchContent_Declare(
    tinkoff-api
    GIT_REPOSITORY https://github.com/RussianInvestments/investAPI
    GIT_TAG b16de288245370f882a1c24575f363609820198f
)
FetchContent_Populate(tinkoff-api)

cmake_path(APPEND TAPI_PROTO_BASE_DIR "${tinkoff-api_SOURCE_DIR}" "src/docs/contracts")

set(PROTOS common instruments marketdata operations orders sandbox stoporders users)

add_custom_target(raw-directory ALL COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_CURRENT_BINARY_DIR}/raw")
get_target_property(grpc_cpp_plugin_location gRPC::grpc_cpp_plugin LOCATION)

foreach (MLIB ${PROTOS})
    set(TARGET_NAME "tapi-${MLIB}")

    cmake_path(APPEND PROTO_PATH "${TAPI_PROTO_BASE_DIR}" "${MLIB}.proto")
    protobuf_generate(OUT_VAR GENERATED_SOURCES PROTOC_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/raw" PROTOS "${TAPI_PROTO_BASE_DIR}/${MLIB}.proto" APPEND_PATH)
    protobuf_generate(
        OUT_VAR GRPC_GENERATED_SOURCES PROTOC_OUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/raw" LANGUAGE grpc GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc PLUGIN
        "protoc-gen-grpc=${grpc_cpp_plugin_location}" PROTOS "${TAPI_PROTO_BASE_DIR}/${MLIB}.proto" APPEND_PATH
    )

    set(_sources)
    foreach (SRC ${GENERATED_SOURCES} ${GRPC_GENERATED_SOURCES})
        cmake_path(GET SRC FILENAME SRC_FILENAME)
        add_custom_command(
            OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILENAME}"
            COMMAND "${CMAKE_COMMAND}" "-DSOURCE=${SRC}" "-DTARGET=${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILENAME}" -P "${CMAKE_CURRENT_SOURCE_DIR}/change_namespace.cmake"
            DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/change_namespace.cmake" "${SRC}" raw-directory
        )
        list(APPEND _sources "${CMAKE_CURRENT_BINARY_DIR}/${SRC_FILENAME}")
    endforeach ()

    add_library(${TARGET_NAME} ${_sources})

    target_include_directories(${TARGET_NAME} SYSTEM INTERFACE ${CMAKE_CURRENT_BINARY_DIR})
    target_link_libraries(${TARGET_NAME} PUBLIC protobuf::libprotobuf gRPC::grpc++)
endforeach (MLIB)

# Based on imports in related `.proto`.
target_link_libraries(tapi-instruments PUBLIC tapi-common)
target_link_libraries(tapi-marketdata PUBLIC tapi-common)
target_link_libraries(tapi-operations PUBLIC tapi-common)
target_link_libraries(tapi-orders PUBLIC tapi-common)
target_link_libraries(tapi-sandbox PUBLIC tapi-common)
target_link_libraries(tapi-sandbox PUBLIC tapi-operations)
target_link_libraries(tapi-sandbox PUBLIC tapi-orders)
target_link_libraries(tapi-sandbox PUBLIC tapi-users)
target_link_libraries(tapi-stoporders PUBLIC tapi-common)
target_link_libraries(tapi-users PUBLIC tapi-common)
...