Skip to content

Commit 8d0679e

Browse files
authored
refactor(facade): migrate all facade APIs from throw to Result<T> (#952)
* refactor(facade): migrate all facade APIs from throw to Result<T> Replace 30 throw statements across 5 facade files with Result<T> return values, unifying error handling with the ecosystem convention. Changes per facade (tcp, quic, udp, websocket, http): - validate_* return type: void -> VoidResult - create_client/create_server return type: shared_ptr -> Result<shared_ptr> - create_connection_pool return type: shared_ptr -> Result<shared_ptr> - throw std::invalid_argument -> return error_void(-1, msg, source) - throw std::runtime_error -> return error<T>(code, msg, source) - Success paths: return ptr -> return ok(ptr) Also fix broken markdown anchors in docs TOC files. Closes #951 * test(facade): update facade tests for Result<T> return types Migrate all facade test assertions from exception-based to Result-based: - EXPECT_THROW -> result.is_err() - EXPECT_NO_THROW(var = ...) -> ASSERT_TRUE(result.is_ok()); var = result.value() - Direct assignment -> result check + value extraction * fix(test): resolve conflicting 'auto result' redeclaration in test scopes Rename second 'auto result' to 'send_result' or 'stop_result' in tests where create_* result and interface method result share scope. * fix(benchmarks): unwrap Result<T> from facade create methods facade create_client() and create_server() now return Result<shared_ptr<T>> instead of shared_ptr<T>. Update all call sites in the benchmark file to unwrap the Result with .value() before using the pointer. * fix(tests): update facade tests for Result<T> return types Facade create methods now return Result<shared_ptr<T>> instead of throwing exceptions or returning raw pointers. Update tests to: - Use .is_ok() and .value() to unwrap Result before nullptr checks - Replace EXPECT_THROW(invalid_argument) with is_err() assertions for port validation tests across TCP, UDP, HTTP, WebSocket, and QUIC facades * fix(tests): suppress nodiscard warnings for VoidResult in e2e tests start_server(), stop_server(), start_client(), stop_client(), and send_packet() now return [[nodiscard]] VoidResult. Cast all call sites to (void) to suppress -Werror=unused-result warnings. * docs(facade): update guide for Result<T> return types Update all facade code examples and API signatures to reflect the migration from throw-based to Result<T> return types in create_client(), create_server(), and create_connection_pool() methods.
1 parent 789fb72 commit 8d0679e

22 files changed

Lines changed: 743 additions & 430 deletions

benchmarks/facade_vs_direct_bench.cpp

Lines changed: 40 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,11 +138,16 @@ static void BM_FacadeClient_Create(benchmark::State& state)
138138
{
139139
try
140140
{
141-
auto client = facade.create_client({
141+
auto client_result = facade.create_client({
142142
.host = "127.0.0.1",
143143
.port = 8080,
144144
.client_id = "bench_client"
145145
});
146+
if (client_result.is_err())
147+
{
148+
break;
149+
}
150+
auto client = client_result.value();
146151
benchmark::DoNotOptimize(client);
147152
// Allow thread cleanup between iterations
148153
(void)client->stop();
@@ -188,10 +193,15 @@ static void BM_FacadeServer_Create(benchmark::State& state)
188193
{
189194
try
190195
{
191-
auto server = facade.create_server({
196+
auto server_result = facade.create_server({
192197
.port = 8080,
193198
.server_id = "bench_server"
194199
});
200+
if (server_result.is_err())
201+
{
202+
break;
203+
}
204+
auto server = server_result.value();
195205
benchmark::DoNotOptimize(server);
196206
// Ensure cleanup before next iteration
197207
(void)server->stop();
@@ -342,10 +352,16 @@ static void BM_FacadeAPI_SendThroughput(benchmark::State& state)
342352
try
343353
{
344354
// Setup server via facade
345-
server = facade.create_server({
355+
auto server_result = facade.create_server({
346356
.port = port,
347357
.server_id = "facade_bench_server"
348358
});
359+
if (server_result.is_err())
360+
{
361+
state.SkipWithError("Failed to create facade server");
362+
return;
363+
}
364+
server = server_result.value();
349365
auto start_result = server->start(port);
350366
if (start_result.is_err())
351367
{
@@ -357,11 +373,18 @@ static void BM_FacadeAPI_SendThroughput(benchmark::State& state)
357373
std::this_thread::sleep_for(std::chrono::milliseconds(50));
358374

359375
// Setup client via facade
360-
client = facade.create_client({
376+
auto client_result = facade.create_client({
361377
.host = "127.0.0.1",
362378
.port = port,
363379
.client_id = "facade_bench_client"
364380
});
381+
if (client_result.is_err())
382+
{
383+
(void)server->stop();
384+
state.SkipWithError("Failed to create facade client");
385+
return;
386+
}
387+
client = client_result.value();
365388
auto connect_result = client->start("127.0.0.1", port);
366389
if (connect_result.is_err())
367390
{
@@ -638,10 +661,16 @@ static void BM_FacadeAPI_FullLifecycle(benchmark::State& state)
638661

639662
try
640663
{
641-
server = facade.create_server({
664+
auto server_result = facade.create_server({
642665
.port = port,
643666
.server_id = "facade_lifecycle_server"
644667
});
668+
if (server_result.is_err())
669+
{
670+
state.SkipWithError("Failed to create server");
671+
return;
672+
}
673+
server = server_result.value();
645674
auto start_result = server->start(port);
646675
if (start_result.is_err())
647676
{
@@ -664,11 +693,16 @@ static void BM_FacadeAPI_FullLifecycle(benchmark::State& state)
664693
try
665694
{
666695
// Create via facade
667-
auto client = facade.create_client({
696+
auto client_result = facade.create_client({
668697
.host = "127.0.0.1",
669698
.port = port,
670699
.client_id = "facade_lifecycle_client"
671700
});
701+
if (client_result.is_err())
702+
{
703+
continue;
704+
}
705+
auto client = client_result.value();
672706

673707
// Connect
674708
auto connect_result = client->start("127.0.0.1", port);

docs/API_REFERENCE_FACADES.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,16 @@ Facade API documentation for the Network System library, covering TCP, UDP, WebS
1818

1919
## Table of Contents
2020

21-
- [Overview](#overview)
22-
- [C++20 Concepts](#c20-concepts)
23-
- [Core Classes](#core-classes)
24-
- [Networking Components](#networking-components)
25-
- [Utility Classes](#utility-classes)
26-
- [Error Handling](#error-handling)
27-
- [Configuration](#configuration)
28-
- [Examples](#examples)
29-
- [Thread Safety](#thread-safety)
30-
- [Platform-Specific Notes](#platform-specific-notes)
21+
- Overview
22+
- C++20 Concepts
23+
- Core Classes
24+
- Networking Components
25+
- Utility Classes
26+
- Error Handling
27+
- Configuration
28+
- Examples
29+
- Thread Safety
30+
- Platform-Specific Notes
3131

3232
## Overview
3333

docs/API_REFERENCE_PROTOCOLS.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,10 @@ Protocol-level API documentation for the Network System library, covering low-le
1818

1919
## Table of Contents
2020

21-
- [Protocol Handlers](#protocol-handlers)
22-
- [Thread Integration API](#thread-integration-api)
23-
- [Version History](#version-history)
24-
- [License](#license)
21+
- Protocol Handlers
22+
- Thread Integration API
23+
- Version History
24+
- License
2525

2626
## Protocol Handlers
2727

0 commit comments

Comments
 (0)