tower_image_xform/lib.rs
1//! # Overview
2//!
3//! This crate provides image transformations, such as resize, as a `tower`
4//! middleware.
5//!
6//! # Usage with an `axum` application
7//!
8//! ```rust,no_run
9//! use std::net::SocketAddr;
10//!
11//! use axum::{routing::get_service, Router};
12//! use tower::ServiceBuilder;
13//! use tower_image_xform::{
14//! image_type, ImageTransformerBuilder, Key, SignedUrlBuilder, SupportedImageTypes,
15//! };
16//! use url::Url;
17//!
18//! const SUPPORTED_IMAGE_TYPES: SupportedImageTypes = &[image_type::WEBP, image_type::PNG];
19//!
20//! #[tokio::main]
21//! async fn main() -> Result<(), Box<dyn std::error::Error>> {
22//! // Service set up.
23//! let signing_key = Key::generate();
24//! let image_xformer = ImageTransformerBuilder::new(signing_key.clone())
25//! .set_supported_image_types(SUPPORTED_IMAGE_TYPES)
26//! .build();
27//!
28//! // URL construction.
29//! let base_url: Url = "http://localhost:3000/_image/".parse()?;
30//! let target_url = "https://www.rustacean.net/assets/rustacean-orig-noshadow.png".parse()?;
31//! let signed_url = SignedUrlBuilder::new()
32//! .key(signing_key)
33//! .base(base_url)
34//! .params()
35//! .height(100)
36//! .width(150)
37//! .target(target_url)
38//! .build()
39//! .generate_signed_url()?;
40//!
41//! println!(
42//! "Open this link in your browser to view the transformed image: {}",
43//! signed_url
44//! );
45//!
46//! // Nest service within an Axum app at `/_image` path.
47//! let image_xform_service = get_service(ServiceBuilder::new().service(image_xformer));
48//! let app = Router::new().nest_service("/_image", image_xform_service);
49//!
50//! let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
51//! let listener = tokio::net::TcpListener::bind(&addr).await?;
52//! axum::serve(listener, app.into_make_service()).await?;
53//!
54//! Ok(())
55//! }
56//! ```
57#![warn(
58 clippy::all,
59 nonstandard_style,
60 future_incompatible,
61 missing_docs,
62 missing_debug_implementations
63)]
64#![forbid(unsafe_code)]
65
66pub mod image_type;
67mod key;
68mod service;
69mod signed;
70mod transformation_params;
71
72pub use image_type::{SupportedImageTypes, DEFAULT_SUPPORTED_IMAGE_TYPES};
73pub use key::Key;
74pub use service::ImageTransformerBuilder;
75pub use signed::{SignedUrlBuilder, Verifier};