Unified Rust SDK for West African mobile payments — Wave, Orange Money, MTN, Moov
# wave-rs 🌍
**🇫🇷 Français** · 🇬🇧 English
SDK Rust unifié pour les APIs de paiement mobile en Afrique de l'Ouest :
**Wave**, **Orange Money**, **MTN Mobile Money** et **Moov Africa**.
Une interface commune, typée et async (Tokio) pour initier des paiements,
consulter des soldes et lister des transactions — quel que soit l'opérateur.
Inclut une CLI (`wave`) pour tester le SDK en terminal.
## Structure du workspace
| Crate | Rôle | État |
|-------|------|------|
| `crates/wave-core` | Types partagés, trait `Provider`, `WaveError` | ✅ |
| `crates/wave-wave` | Provider Wave (clé API) | ✅ |
| `crates/wave-orange` | Provider Orange Money CI (OAuth2 + cache token) | âś… |
| `crates/wave-mtn` | Provider MTN MoMo (flux 202 + polling) | âś… |
| `crates/wave-moov` | Provider Moov Africa (clé API) | ✅ |
| `cli` | Binaire `wave` (pay, balance, transactions, status, providers) | âś… |
| `tests` | Tests d'intégration transverses (`dyn Provider`) | ✅ |
## Démarrage
```bash
cp .env.example .env # puis remplir les credentials
cargo build --workspace
cargo test --workspace
cargo clippy --workspace --all-targets -- -D warnings
```
## Utiliser le SDK
Le contrat central est le trait `Provider` : le mĂŞme code appelant
fonctionne avec les quatre opérateurs.
```rust
use wave_core::{Money, PaymentRequest, PhoneNumber, Provider};
use wave_wave::WaveProvider;
#[tokio::main]
async fn main() -> Result {
let provider = WaveProvider::from_env()?; // WAVE_API_KEY, WAVE_MERCHANT_ID
let to = PhoneNumber::parse("+2250700000000")?;
let request = PaymentRequest::new(to, Money::xof(5000)).with_note("Loyer");
let response = provider.initiate_payment(request).await?;
// Paiements asynchrones : statut initial `Pending`, suivi par polling.
println!("{} → {:?}", response.transaction_id, response.status);
Ok(())
}
```
Exemples complets dans `examples/` :
```bash
cargo run -p wave-cli --example send_payment -- wave +2250700000000 5000 "Loyer"
cargo run -p wave-cli --example check_balan …