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}