Skip to content

Commit 77e218f

Browse files
anaslimembenbrandt
andauthored
chore: remove unreachable!() and improve error messages (#139)
* remove unreachable!(), improve panic messages, fix tautological test * revert debug_assert * format --------- Co-authored-by: Ben Brandt <benjamin.j.brandt@gmail.com>
1 parent f0705a9 commit 77e218f

4 files changed

Lines changed: 29 additions & 14 deletions

File tree

src/agent-client-protocol-conductor/src/mcp_bridge.rs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -95,28 +95,31 @@ pub async fn run_mcp_bridge(port: u16) -> Result<(), agent_client_protocol::Erro
9595
async fn connect_with_retry(port: u16) -> Result<TcpStream, agent_client_protocol::Error> {
9696
let max_retries = 10;
9797
let mut retry_delay_ms = 50;
98+
let mut last_error = None;
9899

99100
for attempt in 1..=max_retries {
100101
match TcpStream::connect(format!("127.0.0.1:{port}")).await {
101102
Ok(stream) => {
102103
tracing::info!("Connected to localhost:{} on attempt {}", port, attempt);
103104
return Ok(stream);
104105
}
105-
Err(e) if attempt < max_retries => {
106+
Err(e) => {
106107
tracing::debug!(
107108
"Connection attempt {} failed: {}, retrying in {}ms",
108109
attempt,
109110
e,
110111
retry_delay_ms
111112
);
112-
tokio::time::sleep(tokio::time::Duration::from_millis(retry_delay_ms)).await;
113-
retry_delay_ms = (retry_delay_ms * 2).min(1000); // Exponential backoff, max 1s
114-
}
115-
Err(e) => {
116-
return Err(agent_client_protocol::Error::into_internal_error(e));
113+
last_error = Some(e);
114+
if attempt < max_retries {
115+
tokio::time::sleep(tokio::time::Duration::from_millis(retry_delay_ms)).await;
116+
retry_delay_ms = (retry_delay_ms * 2).min(1000);
117+
}
117118
}
118119
}
119120
}
120121

121-
unreachable!()
122+
Err(agent_client_protocol::Error::into_internal_error(
123+
last_error.expect("loop ran at least once"),
124+
))
122125
}

src/agent-client-protocol-trace-viewer/src/lib.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,19 +36,25 @@ pub struct TraceHandle {
3636
impl TraceHandle {
3737
/// Push a new event to the trace.
3838
pub fn push(&self, event: serde_json::Value) {
39-
self.events.lock().unwrap().push(event);
39+
self.events
40+
.lock()
41+
.expect("events mutex poisoned")
42+
.push(event);
4043
}
4144

4245
/// Get the current number of events.
4346
#[must_use]
4447
pub fn len(&self) -> usize {
45-
self.events.lock().unwrap().len()
48+
self.events.lock().expect("events mutex poisoned").len()
4649
}
4750

4851
/// Check if empty.
4952
#[must_use]
5053
pub fn is_empty(&self) -> bool {
51-
self.events.lock().unwrap().is_empty()
54+
self.events
55+
.lock()
56+
.expect("events mutex poisoned")
57+
.is_empty()
5258
}
5359
}
5460

@@ -192,7 +198,7 @@ async fn serve_events_from_file(path: &PathBuf) -> Response {
192198
}
193199

194200
fn serve_events_from_memory(events: &Arc<Mutex<Vec<serde_json::Value>>>) -> Response {
195-
let events = events.lock().unwrap();
201+
let events = events.lock().expect("events mutex poisoned");
196202
match serde_json::to_string(&*events) {
197203
Ok(json) => (StatusCode::OK, [("content-type", "application/json")], json).into_response(),
198204
Err(e) => (

src/agent-client-protocol/examples/simple_agent.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ async fn main() -> Result<()> {
1919
.on_receive_dispatch(
2020
async move |message: Dispatch, cx: ConnectionTo<Client>| {
2121
// Respond to any other message with an error
22-
message.respond_with_error(agent_client_protocol::util::internal_error("TODO"), cx)
22+
message.respond_with_error(
23+
agent_client_protocol::util::internal_error("unhandled message"),
24+
cx,
25+
)
2326
},
2427
agent_client_protocol::on_receive_dispatch!(),
2528
)

src/agent-client-protocol/tests/jsonrpc_error_handling.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,8 +219,11 @@ async fn test_incomplete_line() {
219219
// The server should handle EOF mid-message gracefully
220220
let result = connection.connect_to(transport).await;
221221

222-
// Server should terminate cleanly when hitting EOF
223-
assert!(result.is_ok() || result.is_err());
222+
// Server should terminate cleanly (not hang) when EOF is hit mid-message
223+
assert!(
224+
result.is_ok(),
225+
"expected clean shutdown on EOF, got: {result:?}"
226+
);
224227
}
225228

226229
// ============================================================================

0 commit comments

Comments
 (0)