flowglad 0.1.1

(Unofficial) Rust SDK for FlowGlad - Open source billing infrastructure
Documentation
//! Basic customer operations example
//!
//! This example demonstrates the core CRUD operations for customers:
//! - Creating a customer
//! - Retrieving a customer
//! - Updating a customer
//! - Listing customers
//!
//! Run this example with:
//! ```bash
//! FLOWGLAD_API_KEY=sk_test_... cargo run --example basic_customers
//! ```

use flowglad::types::customer::{CreateCustomer, UpdateCustomer};
use flowglad::{Client, Config};
use std::env;

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Get API key from environment variable
    let api_key =
        env::var("FLOWGLAD_API_KEY").expect("FLOWGLAD_API_KEY environment variable must be set");

    // Create a client
    let config = Config::new(api_key);
    let client = Client::new(config)?;

    println!("🚀 FlowGlad Customer API Example\n");

    // Generate unique identifiers for this run
    let timestamp = std::time::SystemTime::now()
        .duration_since(std::time::UNIX_EPOCH)?
        .as_secs();
    let external_id = format!("example_user_{}", timestamp);

    // 1. Create a customer
    println!("1️⃣  Creating a new customer...");
    let customer = client
        .customers()
        .create(
            CreateCustomer::new(&external_id, "Jane Doe")
                .email(&format!("jane+{}@example.com", timestamp))
                .phone("+1-555-0123"),
        )
        .await?;

    println!("   ✓ Created customer:");
    println!("     - ID: {}", customer.id);
    println!("     - External ID: {}", customer.external_id);
    println!("     - Name: {}", customer.name.as_ref().unwrap());
    println!("     - Email: {}", customer.email.as_ref().unwrap());
    println!();

    // 2. Retrieve the customer
    println!("2️⃣  Retrieving customer by external ID...");
    let retrieved = client.customers().get(&external_id).await?;

    println!("   ✓ Retrieved customer:");
    println!("     - ID: {}", retrieved.id);
    println!("     - Name: {}", retrieved.name.as_ref().unwrap());
    println!();

    // 3. Update the customer
    println!("3️⃣  Updating customer information...");
    let updated = client
        .customers()
        .update(
            &external_id,
            UpdateCustomer::new()
                .name("Jane Smith")
                .email(&format!("jane.smith+{}@example.com", timestamp)),
        )
        .await?;

    println!("   ✓ Updated customer:");
    println!("     - New name: {}", updated.name.as_ref().unwrap());
    println!("     - New email: {}", updated.email.as_ref().unwrap());
    println!();

    // 4. List all customers
    println!("4️⃣  Listing all customers...");
    let list = client.customers().list().await?;

    println!("   ✓ Found {} customers", list.len());
    if let Some(has_more) = list.has_more {
        if has_more {
            println!("     (More customers available via pagination)");
        }
    }
    println!();

    // 5. Get billing details
    println!("5️⃣  Fetching billing details...");
    let billing = client.customers().get_billing(&external_id).await?;

    println!("   ✓ Billing details:");
    println!(
        "     - Subscriptions: {}",
        billing.subscriptions.len() + billing.current_subscriptions.len()
    );
    println!("     - Invoices: {}", billing.invoices.len());
    println!("     - Payment methods: {}", billing.payment_methods.len());
    if let Some(portal_url) = billing.billing_portal_url {
        println!("     - Portal URL: {}", portal_url);
    }

    println!("\n✨ Example completed successfully!");

    Ok(())
}