5#include <grpcpp/grpcpp.h>
10#include "absl/strings/str_format.h"
15#include "protos/canvas_automation.grpc.pb.h"
19YazeGRPCServer::YazeGRPCServer() : is_running_(false) {}
22YazeGRPCServer::~YazeGRPCServer() {
26absl::Status YazeGRPCServer::Initialize(
27 int port, test::TestManager* test_manager, Rom* rom,
28 net::RomVersionManager* version_mgr,
29 net::ProposalApprovalManager* approval_mgr,
30 CanvasAutomationServiceImpl* canvas_service) {
32 return absl::FailedPreconditionError(
"Server is already running");
38 if (config_.enable_test_harness && test_manager) {
39 test_harness_service_ =
40 std::make_unique<test::ImGuiTestHarnessServiceImpl>(test_manager);
41 std::cout <<
"✓ ImGuiTestHarness service initialized\n";
42 }
else if (config_.enable_test_harness) {
43 std::cout <<
"⚠ ImGuiTestHarness requested but no TestManager provided\n";
47 if (config_.enable_rom_service && rom) {
49 std::make_unique<net::RomServiceImpl>(rom, version_mgr, approval_mgr);
52 net::RomServiceImpl::Config rom_config;
53 rom_config.require_approval_for_writes =
54 config_.require_approval_for_rom_writes;
55 rom_service_->SetConfig(rom_config);
57 std::cout <<
"✓ ROM service initialized\n";
58 }
else if (config_.enable_rom_service) {
59 std::cout <<
"⚠ ROM service requested but no ROM provided\n";
63 if (config_.enable_canvas_automation && canvas_service) {
65 canvas_service_ = canvas_service;
66 std::cout <<
"✓ Canvas Automation service initialized\n";
67 }
else if (config_.enable_canvas_automation) {
68 std::cout <<
"⚠ Canvas Automation requested but no service provided\n";
71 if (!test_harness_service_ && !rom_service_ && !canvas_service_) {
72 return absl::InvalidArgumentError(
73 "At least one service must be enabled and initialized");
76 return absl::OkStatus();
79absl::Status YazeGRPCServer::Start() {
80 auto status = BuildServer();
85 std::cout <<
"✓ YAZE gRPC automation server listening on 0.0.0.0:"
86 << config_.port <<
"\n";
88 if (test_harness_service_) {
89 std::cout <<
" ✓ ImGuiTestHarness available\n";
92 std::cout <<
" ✓ ROM service available\n";
94 if (canvas_service_) {
95 std::cout <<
" ✓ Canvas Automation available\n";
98 std::cout <<
"\nServer is ready to accept requests...\n";
103 return absl::OkStatus();
106absl::Status YazeGRPCServer::StartAsync() {
107 auto status = BuildServer();
112 std::cout <<
"✓ Unified gRPC server started on port " << config_.port <<
"\n";
115 return absl::OkStatus();
118void YazeGRPCServer::Shutdown() {
119 if (server_ && is_running_) {
120 std::cout <<
"⏹ Shutting down unified gRPC server...\n";
124 std::cout <<
"✓ Server stopped\n";
128bool YazeGRPCServer::IsRunning()
const {
132absl::Status YazeGRPCServer::BuildServer() {
134 return absl::FailedPreconditionError(
"Server already running");
137 std::string server_address = absl::StrFormat(
"0.0.0.0:%d", config_.port);
139 grpc::ServerBuilder builder;
142 builder.AddListeningPort(server_address, grpc::InsecureServerCredentials());
145 if (test_harness_service_) {
149 std::cout <<
" Registering ImGuiTestHarness service...\n";
154 std::cout <<
" Registering ROM service...\n";
155 builder.RegisterService(rom_service_.get());
158 if (canvas_service_) {
159 std::cout <<
" Registering Canvas Automation service...\n";
161 canvas_grpc_service_ =
162 CreateCanvasAutomationServiceGrpc(canvas_service_);
163 builder.RegisterService(canvas_grpc_service_.get());
167 server_ = builder.BuildAndStart();
170 return absl::InternalError(
171 absl::StrFormat(
"Failed to start server on %s", server_address));
176 return absl::OkStatus();