repology 0.1.0

Rust client for the Repology API
Documentation

repology

Crates.io Documentation License: MIT

Rust client for the Repology API.

Provides async and blocking interfaces with built-in rate limiting, auto-pagination, and strongly-typed models.

Usage

use repology::{RepologyClient, ProjectFilter};

#[tokio::main]
async fn main() -> repology::Result<()> {
    let client = RepologyClient::new()?;

    // Fetch a single project
    let packages = client.project("firefox").await?;
    println!("firefox is packaged in {} repositories", packages.len());

    // Find outdated packages in Debian 12
    let filter = ProjectFilter::new()
        .inrepo("debian_12")
        .outdated(true);
    let projects = client.projects(&filter).await?;
    for (name, packages) in &projects {
        println!("{name}: {}", packages[0].version);
    }

    Ok(())
}

Blocking

use repology::RepologyBlockingClient;

let client = RepologyBlockingClient::new()?;
let packages = client.project("firefox")?;

Pagination

Methods like projects() and repository_problems() auto-paginate through all results. For manual control or lazy iteration:

// Lazy streaming (async)
use tokio_stream::StreamExt;

let mut stream = std::pin::pin!(client.projects_iter(&filter));
while let Some(result) = stream.next().await {
    let (name, packages) = result?;
    println!("{name}");
}

// Manual page-by-page
let page1 = client.projects_page(&filter, None).await?;
let cursor = page1.keys().max().unwrap();
let page2 = client.projects_page(&filter, Some(cursor)).await?;

Rate Limiting

The Repology API requires bulk clients to make no more than 1 request per second. This is enforced automatically by default. Configure via the builder:

use std::time::Duration;

let client = RepologyClient::builder()
    .user_agent("my-app/1.0 (https://github.com/me/my-app)")
    .rate_limit(Duration::from_secs(2))
    .build()?;

License

MIT