use crate::ReqwestClientBuilder;
pub struct ConfigRecord {
pub priority: i32,
pub apply: fn(ReqwestClientBuilder) -> ReqwestClientBuilder,
}
inventory::collect!(ConfigRecord);
pub fn default_builder() -> ReqwestClientBuilder {
let mut b = ReqwestClientBuilder::new();
#[cfg(feature = "debug-inventory")]
let mut test_client = ReqwestClientBuilder::new();
let mut records: Vec<&'static ConfigRecord> =
inventory::iter::<ConfigRecord>.into_iter().collect();
records.sort_by_key(|r| r.priority);
#[cfg(feature = "debug-inventory")]
{
eprintln!(
"[HTTP-INVENTORY] Building client with {} registered configurations",
records.len()
);
}
for r in records {
b = (r.apply)(b);
#[cfg(feature = "debug-inventory")]
{
test_client = (r.apply)(test_client);
}
}
#[cfg(feature = "debug-inventory")]
{
eprintln!("[HTTP-INVENTORY] Final builder state (Debug):");
eprintln!("{:#?}", b);
eprintln!(
"[HTTP-INVENTORY] Note: reqwest::ClientBuilder doesn't expose all internal state"
);
eprintln!("[HTTP-INVENTORY] Building test client to verify configuration...");
match test_client.build() {
Ok(client) => {
eprintln!("[HTTP-INVENTORY] ✓ Client built successfully");
eprintln!("[HTTP-INVENTORY] Client debug info: {:#?}", client);
}
Err(e) => {
eprintln!("[HTTP-INVENTORY] ✗ Failed to build client: {}", e);
}
}
}
b
}
pub fn build_client() -> reqwest::Result<reqwest::Client> {
default_builder().build()
}
pub fn inspect_registered_configs() -> Vec<(i32, usize)> {
let mut configs: Vec<(i32, usize)> = inventory::iter::<ConfigRecord>
.into_iter()
.map(|record| (record.priority, record.apply as usize))
.collect();
configs.sort_by_key(|(priority, _)| *priority);
configs
}
pub fn debug_print_inventory() {
eprintln!("[HTTP-INVENTORY] Registered configurations:");
let configs = inspect_registered_configs();
if configs.is_empty() {
eprintln!(" (none)");
} else {
for (i, (priority, ptr)) in configs.iter().enumerate() {
eprintln!(
" [{:2}] Priority: {:4}, Function: 0x{:016x}",
i, priority, ptr
);
}
eprintln!(" Total: {} configurations", configs.len());
}
}
pub fn registered_config_count() -> usize {
inventory::iter::<ConfigRecord>.into_iter().count()
}