From 5c40534e98fce33cf2ca7c9ee5c13c1feaa2a571 Mon Sep 17 00:00:00 2001 From: Ahmed Ibrahim Date: Tue, 25 Nov 2025 12:42:25 -0800 Subject: [PATCH] use client --- codex-rs/status/Cargo.toml | 1 + codex-rs/status/src/lib.rs | 44 +++++++++++++++++++++++--------------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/codex-rs/status/Cargo.toml b/codex-rs/status/Cargo.toml index 28aaad1278..89ea645840 100644 --- a/codex-rs/status/Cargo.toml +++ b/codex-rs/status/Cargo.toml @@ -9,6 +9,7 @@ workspace = true [dependencies] anyhow = { workspace = true } +codex-client = { path = "../codex-client" } reqwest = { workspace = true, features = ["json"] } serde = { workspace = true, features = ["derive"] } serde_json = { workspace = true } diff --git a/codex-rs/status/src/lib.rs b/codex-rs/status/src/lib.rs index 179bd04ca9..3821a8231b 100644 --- a/codex-rs/status/src/lib.rs +++ b/codex-rs/status/src/lib.rs @@ -2,13 +2,16 @@ use anyhow::Context; use anyhow::Result; use anyhow::anyhow; use anyhow::bail; -use reqwest::header::CONTENT_TYPE; +use codex_client::Request; +use codex_client::ReqwestTransport; +use http::header::CONTENT_TYPE; use serde::Deserialize; use serde::Serialize; use serde_json::Value; +use std::fmt; use std::time::Duration; -#[derive(Debug, Clone, Display, Copy, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] pub enum ComponentHealth { Operational, @@ -21,11 +24,23 @@ pub enum ComponentHealth { } impl ComponentHealth { + fn operational() -> Self { + Self::Operational + } + pub fn is_operational(self) -> bool { self == Self::Operational } } +impl fmt::Display for ComponentHealth { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let value = Value::from(self).as_str().ok_or(fmt::Error)?; + + f.write_str(value) + } +} + pub async fn fetch_codex_health() -> Result { let client = reqwest::Client::builder() .connect_timeout(Duration::from_secs(5)) @@ -33,26 +48,23 @@ pub async fn fetch_codex_health() -> Result { .build() .context("building HTTP client")?; - let response = client - .get(STATUS_WIDGET_URL) - .send() + let response = ReqwestTransport::new(client) + .execute(Request::new( + http::Method::GET, + STATUS_WIDGET_URL.to_string(), + )) .await - .context("requesting status widget")? - .error_for_status() - .context("status widget returned error")?; + .context("requesting status widget")?; let content_type = response - .headers() + .headers .get(CONTENT_TYPE) .and_then(|value| value.to_str().ok()) .unwrap_or_default() .to_ascii_lowercase(); if !content_type.contains("json") { - let snippet = response - .text() - .await - .unwrap_or_default() + let snippet = String::from_utf8_lossy(&response.body) .chars() .take(200) .collect::(); @@ -62,10 +74,8 @@ pub async fn fetch_codex_health() -> Result { ); } - let payload = response - .json::() - .await - .context("parsing status widget JSON")?; + let payload: StatusPayload = + serde_json::from_slice(&response.body).context("parsing status widget JSON")?; derive_component_health(&payload, CODEX_COMPONENT_NAME) }