Crate ipp

source ·
Expand description

IPP print protocol implementation for Rust. This crate can be used in several ways:

  • using the low-level request/response API and building the requests manually.
  • using the higher-level operations API with builders. Currently only a subset of all IPP operations is supported.
  • using the built-in IPP client.
  • using any third-party HTTP client and send the serialized request manually.

This crate supports both synchronous and asynchronous operations. The following feature flags are supported:

  • async - enables asynchronous APIs
  • async-client - enables asynchronous IPP client based on reqwest crate, implies async feature
  • client - enables blocking IPP client based on ureq crate
  • async-client-tls - enables asynchronous IPP client with TLS support
  • client-tls - enables blocking IPP client with TLS support

By default, all features are enabled.

Implementation notes:

  • all RFC IPP values are supported including arrays and collections, for both de- and serialization.
  • this crate is also suitable for building IPP servers, however the example is not provided yet.
  • some operations (e.g. CUPS-specific) require authorization which can be supplied in the printer URI.

Usage examples:

 // using low-level async API
 use ipp::prelude::*;

 #[tokio::main]
 async fn main() -> Result<(), Box<dyn std::error::Error>> {
     let uri: Uri = "http://localhost:631/printers/test-printer".parse()?;
     let req = IppRequestResponse::new(
         IppVersion::v1_1(),
         Operation::GetPrinterAttributes,
         Some(uri.clone())
     );
     let client = AsyncIppClient::new(uri);
     let resp = client.send(req).await?;
     if resp.header().status_code().is_success() {
         println!("{:?}", resp.attributes());
     }
     Ok(())
 }
 // using blocking operations API
 use ipp::prelude::*;

 fn main() -> Result<(), Box<dyn std::error::Error>> {
     let uri: Uri = "http://localhost:631/printers/test-printer".parse()?;
     let operation = IppOperationBuilder::get_printer_attributes(uri.clone()).build();
     let client = IppClient::new(uri);
     let resp = client.send(operation)?;
     if resp.header().status_code().is_success() {
         println!("{:?}", resp.attributes());
     }
     Ok(())
 }

Modules§

Structs§