diff --git a/Package.swift b/Package.swift index 64cd18c5..15b4740a 100644 --- a/Package.swift +++ b/Package.swift @@ -283,6 +283,7 @@ let package = Package( "internal/analytics/BUILD", "internal/flags/BUILD", "internal/network/BUILD", + "internal/rpc/BUILD", "internal/base/BUILD", "internal/data/BUILD", "internal/test/BUILD", diff --git a/internal/rpc/BUILD b/internal/rpc/BUILD new file mode 100644 index 00000000..8fcb3675 --- /dev/null +++ b/internal/rpc/BUILD @@ -0,0 +1,29 @@ +# Copyright 2025 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +load("@rules_cc//cc:cc_library.bzl", "cc_library") + +licenses(["notice"]) + +cc_library( + name = "utils", + hdrs = ["utils.h"], + visibility = ["//:__subpackages__"], + deps = [ + "//third_party/grpc:grpc++", + "@com_google_absl//absl/functional:any_invocable", + "@com_google_absl//absl/status", + "@com_google_absl//absl/status:statusor", + ], +) diff --git a/internal/rpc/utils.h b/internal/rpc/utils.h new file mode 100644 index 00000000..51734be3 --- /dev/null +++ b/internal/rpc/utils.h @@ -0,0 +1,50 @@ +// Copyright 2025 Google LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// https://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef THIRD_PARTY_NEARBY_INTERNAL_RPC_UTILS_H_ +#define THIRD_PARTY_NEARBY_INTERNAL_RPC_UTILS_H_ + +#include + +#include "absl/functional/any_invocable.h" +#include "absl/status/status.h" +#include "absl/status/statusor.h" +#include "third_party/grpc/include/grpcpp/client_context.h" +#include "third_party/grpc/include/grpcpp/support/status.h" + +namespace nearby::rpc { + +// Converts a gRPC status to an absl status. +inline absl::Status GrpcStatusToAbslStatus(const grpc::Status& status) { + if (status.ok()) { + return absl::OkStatus(); + } + return absl::Status(static_cast(status.error_code()), + std::string(status.error_message())); +} + +// A struct that holds the arguments for an async RPC call. This is used to +// ensure that the RPC arguments outlive the RPC call. +template +struct AsyncRpcArgs { + grpc::ClientContext context; + Request request; + Response response; + absl::AnyInvocable& response) &&> + callback; +}; + +} // namespace nearby::rpc + +#endif // THIRD_PARTY_NEARBY_INTERNAL_RPC_UTILS_H_