simple_pyth_client_rs 0.1.0

Rust wrapper for Pyth Hermes crypto price feeds
Documentation
# Pyth Price Feed API Wrapper (Rust)

A high-performance, async Rust SDK that lets you query and stream live crypto prices using the [Pyth Hermes API](https://hermes.pyth.network). Built with a focus on simplicity, performance, and extensibility — ideal for financial tooling, bots, dashboards, and DEXs.

## ✨ Features

- 🔍 Fetch live and historical token prices (price + EMA)
- 📈 Stream real-time price updates with low latency
- 🔄 Built-in USD filtering for all tracked tokens
- ⚖️ Flexible architecture ready for extension
- ⚡ Powered by `reqwest`, `tokio`, and `futures`

---

## 📦 Installation

> Requires Rust 1.70+ and Tokio async runtime

Add the following to your `Cargo.toml`:

```toml
[dependencies]
reqwest = { version = "0.11", features = ["json", "stream"] }
tokio = { version = "1", features = ["full"] }
futures = "0.3"
serde = { version = "1", features = ["derive"] }
serde_json = "1"
anyhow = "1"
once_cell = "1.19"
```

---

## 🚀 Quickstart

```rust
#[tokio::main]
async fn main() -> anyhow::Result<()> {
     use simple_pyth_client_rs::*;
     // Search for specific crypto/USD pairs
     let symbols = vec!["BTC", "ETH", "USDC", "SOL", "USDT"];
     let price_feeds = search_by_token_symbols(symbols).await?;
     println!("{:?}", price_feeds);
     Ok(())
}
```

---

## 📘️ API Methods

### `get_price_feeds() -> Result<Vec<PriceFeed>>`

Fetches the complete list of Pyth price feeds for `crypto` pairs.

---

### `get_token_price_info(ids: &Vec<String>) -> Result<Vec<TokenPriceInfo>>`

Returns detailed price info (price, EMA, timestamp, fluctuation) for specified feeds. If `ids` is `None`, defaults to all tracked tokens.

---

### `get_live_price_stream(ids: &Vec<String>, callback: F)`

Streams live price updates for the given token IDs, calling the `callback` with `Vec<TokenPriceInfo>` as each update arrives.

```rust
get_live_price_stream(&vec![...], |prices| async move {
    for p in prices {
        println!("Live: {} = {}", p.token_symbol, p.price_30s);
    }
}).await?;
```

---

### `get_price_stream_for_duration(ids, duration_secs, tx)`

Streams prices for a limited duration and sends each `TokenPriceInfo` to the provided `tokio::mpsc::Sender`.

---

### `search_by_token_symbols(symbols: Vec<&str>) -> Result<Vec<TokenPriceInfo>>`

Search for live prices using human-readable symbols (e.g., `"BTC"`, `"ETH"`).

```rust
let result = search_by_token_symbols(vec!["btc", "doge"]).await?;
for r in result {
    println!("{} → ${}", r.token_symbol, r.price_30s);
}
```

---

## 🧱 Types

### `PriceFeed`

Represents metadata about each token's price feed, including ID, symbol, and display format.

```rust
pub struct PriceFeed {
    pub id: String,
    pub attributes: Attr,
}
pub struct Attr {
    pub asset_type: String,
    pub base: String,
    pub description: String,
    pub display_symbol: String,
    pub generic_symbol: String,
    pub quote_currency: String,
    pub schedule: String,
    pub symbol: String,
}
```

### `TokenPriceInfo`

```rust
struct TokenPriceInfo {
    name: String,
    token_id: String,
    token_symbol: String,
    price_30s: f64,
    price_1m: f64,
    timestamp: i64,
    fluctuation_pct: f64,
}
```

---

## 🛠️ Notes

- Price data includes a 30s price and 1m EMA, which you can use for basic volatility analysis.
- `apply_exponent` handles converting scientific notation with a decimal exponent.

## 📜 License

MIT — feel free to fork, use, and modify.

---

## ✍️ Author

**Joshthebuilda**
_5+ years building fullstack crypto and developer infrastructure_
[Portfolio](https://joshuaokechukwu.vzy.io/) • [LinkedIn](https://linkedin.com/in/joshuaokechukwu001)