dimicon 0.2.0

Docker Image Icon - A library for fetching Docker image icons
Documentation
use dimicon::{IconService, ImageReference};

#[tokio::main]
async fn main() -> Result<(), dimicon::Error> {
    tracing_subscriber::fmt()
        .with_env_filter(
            tracing_subscriber::EnvFilter::from_default_env()
                .add_directive(tracing::Level::DEBUG.into()),
        )
        .init();

    let service = IconService::new();

    let images = [
        "nginx",
        "redis",
        "haproxy",
        "localstack/localstack",
        "tensorflow/tensorflow",
        "ghcr.io/corespeed-io/example",
    ];

    println!("=== dimicon — Docker Image Icon ===\n");

    for image in &images {
        print!("Fetching icon for: {image} ... ");

        match service.get_icon(image).await {
            Ok(Some(icon)) => {
                println!("✓ Found");
                println!("  URL: {}", icon.url());
            }
            Ok(None) => println!("✗ Not Found"),
            Err(e) => println!("✗ Error: {e}"),
        }
        println!();
    }

    println!("=== Image Reference Parsing ===\n");

    let refs = [
        "nginx",
        "nginx:latest",
        "myuser/myimage:v1.0",
        "myorg/team/app",
        "ghcr.io/owner/app:latest",
        "registry.example.com/ns/image:tag",
        "nginx@sha256:abc123",
    ];

    for input in &refs {
        match ImageReference::parse(input) {
            Ok(r) => {
                println!("Input:     {input}");
                println!("  Registry:  {}", r.registry());
                println!("  Namespace: {}", r.namespace());
                println!("  Name:      {}", r.name());
                println!("  Tag:       {:?}", r.tag());
                println!("  Digest:    {:?}", r.digest());
                println!("  Official:  {}", r.is_docker_official());
                println!("  GHCR:      {}", r.is_ghcr());
                println!();
            }
            Err(e) => println!("Input: {input} → Error: {e}\n"),
        }
    }

    Ok(())
}