wave-api 0.1.0

Typed Rust client for the Wave Accounting GraphQL API
Documentation
use rust_decimal_macros::dec;
use wave_claw::inputs::{InvoiceCreateInput, InvoiceCreateItemInput};
use wave_claw::{OAuthConfig, WaveClient};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    dotenvy::dotenv().ok();

    let client = WaveClient::with_oauth(OAuthConfig {
        client_id: std::env::var("WAVE_CLIENT_ID")?,
        client_secret: std::env::var("WAVE_CLIENT_SECRET")?,
        access_token: std::env::var("WAVE_ACCESS_TOKEN")?,
        refresh_token: std::env::var("WAVE_REFRESH_TOKEN")?,
        redirect_uri: std::env::var("WAVE_REDIRECT_URI")
            .unwrap_or_else(|_| "http://localhost:3099/callback".into()),
        on_token_refresh: None,
    });

    // Replace these with real IDs from your Wave account.
    let business_id = std::env::var("WAVE_BUSINESS_ID")?;
    let customer_id = std::env::var("WAVE_CUSTOMER_ID")?;
    let product_id = std::env::var("WAVE_PRODUCT_ID")?;

    let input = InvoiceCreateInput::new(&business_id, &customer_id)
        .items(vec![
            InvoiceCreateItemInput::new(&product_id)
                .quantity(dec!(2))
                .unit_price(dec!(49.99)),
        ])
        .memo("Thank you for your business!");

    let invoice = client.create_invoice(input).await?;
    println!("Created invoice #{} ({})", invoice.invoice_number, invoice.id);
    println!("  Status: {:?}", invoice.status);
    println!("  Total: {} {}", invoice.total.value, invoice.total.currency.symbol);
    println!("  PDF: {}", invoice.pdf_url);

    Ok(())
}