escl 0.3.0

A Rust library for discovering and using scanners via the eSCL protocol (scanning over network)
Documentation
use std::{io::Write, time::Duration};

use escl::{
    discover,
    settings::{ContentRegionUnits, InputSource, ScanRegion, ScanRegions},
    Scanner,
};

#[tokio::main]
async fn main() {
    println!("Looking for scanners in LAN...");

    let scanner_services = discover(Duration::from_secs(5))
        .await
        .expect("error discovering scanner services");

    let chosen_service = scanner_services.first().expect("no scanner found in LAN");
    println!(
        "Scanner chosen: {} ({})",
        chosen_service.name(),
        chosen_service.url()
    );

    let scanner: Scanner = chosen_service.into();

    let capabilities = scanner
        .capabilities()
        .await
        .expect("unable to fetch capabilities");
    println!("Scanner capabilities: \n{:#?}", capabilities);

    let job = scanner
        .scan(&escl::settings::ScanSettings {
            version: capabilities.version,
            intent: None,
            scan_regions: Some(ScanRegions {
                scan_region: ScanRegion {
                    height: capabilities.platen.platen_input_caps.max_height,
                    content_region_units: ContentRegionUnits::ThreeHundredthsOfInches,
                    width: capabilities.platen.platen_input_caps.max_width,
                    x_offset: 0,
                    y_offset: 0,
                },
            }),
            document_format_ext: Some("image/jpeg".to_owned()),
            x_resolution: None,
            y_resolution: None,
            input_source: Some(InputSource::Platen),
            color_mode: capabilities
                .platen
                .platen_input_caps
                .setting_profiles
                .setting_profile
                .color_modes
                .color(),
            compression_factor: None,
            blank_page_detection: Some(false),
        })
        .await
        .expect("unable to submit scan job");
    println!("Scan job URL: {}", job.job_url());

    let status = scanner.status().await.expect("unable to fetch status");
    println!("Scanner status: \n{:#?}", status);

    println!("Downloading scanned page...");
    let image = job
        .next_document()
        .await
        .expect("unable to fetch scanned page")
        .expect("at least one page should be available");

    let mut image_file = std::fs::File::create("./scan.jpg").expect("unable to create output file");
    image_file
        .write_all(&image)
        .expect("unable to write to output file");
}