Magic 8 Ball
// Copyright (C) 2023 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include "serverrunner.h" #include "exampleservice.grpc.pb.h" #include <QThread> #include <QDebug> #include <QRandomGenerator> #include <grpc++/grpc++.h> #include <memory> #include <array> #include <random> namespace { using grpc::Server; using grpc::ServerBuilder; using grpc::ServerContext; using grpc::ServerWriter; using grpc::Status; using qtgrpc::examples::AnswerRequest; using qtgrpc::examples::AnswerResponse; using qtgrpc::examples::ExampleService; static const std::array<std::string_view, 10> answers = {"Yes", "Yep", "Most\nlikely", "It is\ncertain", "No", "Nope", "Try later", "Are you\nsure?", "Maybe", "Very\ndoubtful"}; // Generates random index value. static int generateRandomIndex() { static std::uniform_int_distribution<int> dist(0, answers.size() - 1); return dist(*QRandomGenerator::global()); } // Logic and data behind the server's behavior. class ExampleServiceServiceImpl final : public qtgrpc::examples::ExampleService::Service { grpc::Status answerMethod(grpc::ServerContext *, const AnswerRequest *request, AnswerResponse *response) override; }; } Status ExampleServiceServiceImpl::answerMethod(grpc::ServerContext *, const AnswerRequest *request, AnswerResponse *response) { if (request->message() == "sleep") QThread::msleep(2000); response->set_message(std::string(answers[generateRandomIndex()])); return Status(); } void ExampleServer::run() { std::string serverUri("127.0.0.1:50051"); ExampleServiceServiceImpl service; grpc::ServerBuilder builder; builder.AddListeningPort(serverUri, grpc::InsecureServerCredentials()); builder.RegisterService(&service); std::unique_ptr<grpc::Server> server(builder.BuildAndStart()); if (!server) { qDebug() << "Creating grpc::Server failed."; return; } qDebug() << "Server listening on " << serverUri; server->Wait(); }