9#include <grpcpp/support/status.h>
11USERVER_NAMESPACE_BEGIN
18template <
typename Response>
22 Result(Response&& response) : result_{std::move(response)} {}
25 Result(grpc::Status&& status) : result_{std::move(status)} {
26 UINVARIANT(!GetErrorStatus().ok(),
"Only error status allowed");
30 Result(
const grpc::Status& status) : result_{status} {
31 UINVARIANT(!GetErrorStatus().ok(),
"Only error status allowed");
35 bool IsSuccess()
const {
return std::holds_alternative<Response>(result_); }
37 Response&& ExtractResponse() && {
38 UINVARIANT(IsSuccess(),
"ExtractResponse allowed only in success state");
39 return std::get<Response>(std::move(result_));
42 const Response& GetResponse()
const {
43 UINVARIANT(IsSuccess(),
"GetResponse allowed only in success state");
44 return std::get<Response>(result_);
47 const grpc::Status& GetErrorStatus()
const {
48 UINVARIANT(!IsSuccess(),
"GetErrorStatus allowed only in error state");
49 return std::get<grpc::Status>(result_);
54 std::variant<Response, grpc::Status> result_;
58template <
typename Response>
59class StreamingResult final {
71 StreamingResult(Response&& last_response) : last_response_(std::move(last_response)) {}
74 bool HasLastResponse()
const {
return last_response_.has_value(); }
76 Response&& ExtractLastResponse() && {
return std::move(last_response_).value(); }
78 const Response& GetLastResponse()
const {
return last_response_.value(); }
80 const grpc::Status& GetStatus()
const {
return status_; }
84 std::optional<Response> last_response_;
85 grpc::Status status_{grpc::Status::OK};