# cg-common
Shared infrastructure library for CoinGecko and crypto data CLI tools.
## Features
- **HTTP Client** - Async client with automatic rate limiting and retry
- **Rate Limiting** - Governor-based rate limiter (10 req/min default for CoinGecko free tier)
- **Retry Logic** - Exponential backoff with special handling for 429 rate limits
- **Symbol Resolution** - Maps crypto symbols (BTC, ETH) to CoinGecko IDs (bitcoin, ethereum)
- **Output Writers** - JSON and CSV writers with pretty-print support
## Usage
```rust
use cg_common::{CoinGeckoClientBuilder, resolve_symbol, JsonWriter};
// Build HTTP client with rate limiting
let client = CoinGeckoClientBuilder::new()
.with_rate_limit(10) // 10 requests per minute
.build()?;
// Resolve symbol to CoinGecko ID
let id = resolve_symbol("BTC"); // Returns "bitcoin"
// Make API request (auto-retries on 429)
let response = client.get("/coins/bitcoin").await?;
// Write JSON output
let writer = JsonWriter::new(Some("output.json".into()), true);
writer.write(&data)?;
```
## Supported Symbols
50+ pre-mapped symbols including:
| BTC | bitcoin |
| ETH | ethereum |
| SOL | solana |
| XRP | ripple |
| DOGE | dogecoin |
| ADA | cardano |
| ... | ... |
Use `resolve_symbol()` to convert any symbol, or pass CoinGecko IDs directly.
## Rate Limiting
The client implements conservative rate limiting for CoinGecko's free tier:
- Default: 10 requests/minute
- Automatic retry on 429 with 30s/60s/120s backoff
- Configurable via `with_rate_limit()`
## License
MIT