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

Mulai dari [panduan gRPC](/docs/id/api/grpc) untuk mendapatkan token Platform API dan mengunduh `platform.proto`. Pasang `protoc`, `grpc_cpp_plugin`, serta pustaka gRPC dan protobuf C++. Lihat [panduan pengaturan C++ resmi](https://grpc.io/docs/languages/cpp/quickstart/) untuk pemasangan.

Hasilkan pesan protobuf dan stub layanan dalam direktori yang berisi `platform.proto`:

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

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

Simpan sebagai `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';
  }
}
```

Gunakan `CMakeLists.txt` ini untuk mengompilasi berkas hasil dan klien:

```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)
```

Jalankan `cmake -S . -B build`, lalu `cmake --build build` dan `./build/reconstruct_client`.
