bindist 0.1.0

Rust client library for the BinDist Customer API
Documentation
use std::env;

use bindist::{Client, GetDownloadInfoOptions, ListApplicationsOptions, ListVersionsOptions};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let api_key = env::var("BINDIST_API_KEY").map_err(|_| "BINDIST_API_KEY is required")?;
    let base_url =
        env::var("BINDIST_BASE_URL").unwrap_or_else(|_| "https://api.bindist.eu".to_owned());

    println!("Using base URL: {base_url}\n");

    let client = Client::new(base_url, api_key)?;

    println!("=== List Applications ===");
    let apps = client
        .list_applications(&ListApplicationsOptions::default())
        .await?;
    println!("Found {} applications", apps.items.len());
    for app in &apps.items {
        println!("  - {} ({})", app.name, app.application_id);
        if let Some(desc) = &app.description {
            println!("    Description: {desc}");
        }
        if !app.tags.is_empty() {
            println!("    Tags: {:?}", app.tags);
        }
    }

    let Some(first_app) = apps.items.first() else {
        println!("\nNo applications; stopping.");
        return Ok(());
    };
    let app_id = &first_app.application_id;

    println!("\n=== List Versions for {app_id} ===");
    let versions = client
        .list_versions(app_id, &ListVersionsOptions::default())
        .await?;
    println!("Found {} versions", versions.items.len());
    for v in &versions.items {
        println!(
            "  - {} (enabled: {}, size: {} bytes)",
            v.version, v.is_enabled, v.file_size
        );
        if let Some(notes) = &v.release_notes {
            println!("    Release notes: {notes}");
        }
    }

    let Some(first_version) = versions.items.first() else {
        return Ok(());
    };
    let version = &first_version.version;

    println!("\n=== List Files for {app_id} v{version} ===");
    let files = client.list_version_files(app_id, version).await?;
    println!("Found {} files", files.len());
    for f in &files {
        println!(
            "  - {} ({:?}, {} bytes)",
            f.file_name, f.file_type, f.file_size
        );
    }

    println!("\n=== Get Download Info for {app_id} v{version} ===");
    let info = client
        .get_download_info(app_id, version, &GetDownloadInfoOptions::default())
        .await?;
    let preview: String = info.url.chars().take(50).collect();
    println!("Download URL: {preview}...");
    println!("File name:   {}", info.file_name);
    println!("File size:   {} bytes", info.file_size);
    println!("Checksum:    {}", info.checksum);
    println!("Expires at:  {}", info.expires_at);

    println!("\n=== All tests passed! ===");
    Ok(())
}