armature_http_client/
lib.rs

1//! # Armature HTTP Client
2//!
3//! A robust HTTP client with built-in retry logic, circuit breaker pattern,
4//! timeout management, and request/response interceptors.
5//!
6//! ## Features
7//!
8//! - **Retry with Backoff**: Configurable retry strategies (exponential, linear, constant)
9//! - **Circuit Breaker**: Prevents cascade failures with automatic recovery
10//! - **Timeouts**: Per-request and global timeout configuration
11//! - **Interceptors**: Request/response transformation and logging
12//! - **Connection Pooling**: Efficient connection reuse
13//! - **Compression**: Automatic gzip/brotli support
14//!
15//! ## Quick Start
16//!
17//! ```rust,no_run
18//! use armature_http_client::{HttpClient, HttpClientConfig};
19//!
20//! #[tokio::main]
21//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
22//!     let client = HttpClient::new(HttpClientConfig::default());
23//!
24//!     let response = client
25//!         .get("https://api.example.com/users")
26//!         .send()
27//!         .await?;
28//!
29//!     println!("Status: {}", response.status());
30//!     Ok(())
31//! }
32//! ```
33//!
34//! ## With Retry and Circuit Breaker
35//!
36//! ```rust,no_run
37//! use armature_http_client::{HttpClient, HttpClientConfig, RetryConfig, CircuitBreakerConfig};
38//! use std::time::Duration;
39//!
40//! #[tokio::main]
41//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
42//!     let config = HttpClientConfig::builder()
43//!         .timeout(Duration::from_secs(30))
44//!         .retry(RetryConfig::exponential(3, Duration::from_millis(100)))
45//!         .circuit_breaker(CircuitBreakerConfig::default())
46//!         .build();
47//!
48//!     let client = HttpClient::new(config);
49//!
50//!     // Requests will automatically retry on failure
51//!     // Circuit breaker will open after consecutive failures
52//!     let response = client
53//!         .post("https://api.example.com/orders")
54//!         .json(&serde_json::json!({"item": "widget", "quantity": 5}))
55//!         .send()
56//!         .await?;
57//!
58//!     Ok(())
59//! }
60//! ```
61
62mod circuit_breaker;
63mod client;
64mod config;
65mod error;
66mod interceptor;
67mod middleware;
68mod request;
69mod response;
70mod retry;
71
72pub use circuit_breaker::{CircuitBreaker, CircuitBreakerConfig, CircuitState};
73pub use client::HttpClient;
74pub use config::{HttpClientConfig, HttpClientConfigBuilder};
75pub use error::{HttpClientError, Result};
76pub use interceptor::{Interceptor, RequestInterceptor, ResponseInterceptor};
77pub use middleware::{Middleware, MiddlewareChain};
78pub use request::RequestBuilder;
79pub use response::Response;
80pub use retry::{BackoffStrategy, RetryConfig, RetryStrategy};
81
82// Re-export common types
83pub use bytes::Bytes;
84pub use http::{HeaderMap, HeaderValue, Method, StatusCode, header};
85pub use url::Url;
86
87/// Prelude for common imports.
88///
89/// ```
90/// use armature_http_client::prelude::*;
91/// ```
92pub mod prelude {
93    pub use crate::circuit_breaker::{CircuitBreaker, CircuitBreakerConfig, CircuitState};
94    pub use crate::client::HttpClient;
95    pub use crate::config::{HttpClientConfig, HttpClientConfigBuilder};
96    pub use crate::error::{HttpClientError, Result};
97    pub use crate::interceptor::{Interceptor, RequestInterceptor, ResponseInterceptor};
98    pub use crate::middleware::{Middleware, MiddlewareChain};
99    pub use crate::request::RequestBuilder;
100    pub use crate::response::Response;
101    pub use crate::retry::{BackoffStrategy, RetryConfig, RetryStrategy};
102    pub use http::{HeaderMap, HeaderValue, Method, StatusCode, header};
103}