
# C++ {/* #c */}

Platform API 토큰을 만들고 `platform.proto`를 받으려면 [gRPC 가이드](/docs/ko/api/grpc)부터 시작하세요. `protoc`, `grpc_cpp_plugin`, gRPC 및 protobuf C++ 라이브러리를 설치하세요. 설치 방법은 [공식 C++ 시작 가이드](https://grpc.io/docs/languages/cpp/quickstart/)를 참고하세요.

`platform.proto`가 있는 디렉터리에서 protobuf 메시지와 서비스 스텁을 생성하세요:

```bash
protoc -I. --cpp_out=. platform.proto
```

```bash
protoc -I. --grpc_out=. \
  --plugin=protoc-gen-grpc="$(command -v grpc_cpp_plugin)" platform.proto
```

`main.cc`로 저장하세요:

```cpp
#include <cstdlib>
#include <iostream>
#include <memory>
#include <string>

#include <grpcpp/grpcpp.h>
#include "platform.grpc.pb.h"

int main() {
  const char* token = std::getenv("CR_RECONSTRUCT_API_TOKEN");
  if (!token || !*token) {
    std::cerr << "Set CR_RECONSTRUCT_API_TOKEN\n";
    return 1;
  }

  auto channel = grpc::CreateChannel(
      "reconstruct.dev:443", grpc::SslCredentials(grpc::SslCredentialsOptions{}));
  auto client = reconstruct::platform::v1::PlatformService::NewStub(channel);
  reconstruct::platform::v1::ListCatalogsRequest list_request;
  list_request.set_page_size(10);
  reconstruct::platform::v1::ListCatalogsResponse page;
  grpc::ClientContext list_context;
  list_context.AddMetadata("authorization", std::string("Bearer ") + token);

  auto status = client->ListCatalogs(&list_context, list_request, &page);
  if (!status.ok()) {
    std::cerr << status.error_message() << '\n';
    return 1;
  }

  for (const auto& catalog : page.catalogs()) {
    reconstruct::platform::v1::GetCatalogRequest get_request;
    get_request.set_catalog_id(catalog.catalog_id());
    reconstruct::platform::v1::GetCatalogResponse detail;
    grpc::ClientContext get_context;
    get_context.AddMetadata("authorization", std::string("Bearer ") + token);
    status = client->GetCatalog(&get_context, get_request, &detail);
    if (!status.ok()) {
      std::cerr << status.error_message() << '\n';
      return 1;
    }
    std::cout << detail.catalog_id() << ": " << detail.description() << '\n';
  }
}
```

생성된 파일과 클라이언트를 컴파일하려면 다음 `CMakeLists.txt`를 사용하세요:

```cmake
cmake_minimum_required(VERSION 3.16)
project(reconstruct_client LANGUAGES CXX)
set(CMAKE_CXX_STANDARD 17)

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

add_executable(reconstruct_client
  main.cc platform.pb.cc platform.grpc.pb.cc)
target_link_libraries(reconstruct_client PRIVATE
  gRPC::grpc++ protobuf::libprotobuf)
```

`cmake -S . -B build`, `cmake --build build`, `./build/reconstruct_client`를 순서대로 실행하세요.
