Skip to main content

Crate smart_package_tracker

Crate smart_package_tracker 

Source
Expand description

Generate package tracking IDs and render them as barcodes.

use smart_package_tracker::{Barcode, RenderOptions, TrackingId};

// 1. Mint an identifier.
let id = TrackingId::generate()?;          // e.g. PKG-9ED9285C

// 2. Encode it as a Code 128 barcode.
let barcode = Barcode::code128(&id)?;

// 3. Export it.
let options = RenderOptions::default();    // 300 dpi, 13 mil, 25 mm tall
let png: Vec<u8> = barcode.to_png(&options)?;
let svg: String  = barcode.to_svg(&options)?;

assert_eq!(&png[..8], b"\x89PNG\r\n\x1a\n");
assert!(svg.contains("<svg"));

§Design

The pipeline has two independent halves, joined by a dimension-agnostic bit grid:

TrackingId ──▶ Symbology::encode ──▶ Symbol ──▶ Renderer::render ──▶ bytes
               (Code 128 | QR)       (BitMatrix)  (Png | Svg)

A linear barcode is a one-row BitMatrix; a matrix symbology such as QR is a square one. Because renderers consume the grid rather than the symbology, adding a format means implementing Symbology and nothing else — QR support landed without a single change to the PNG or SVG renderers.

Both renderers share one Layout calculation, so PNG and SVG output describe identical geometry at identical physical size.

Scanning runs the same pipeline backwards, meeting it at the same grid:

image ──▶ GrayImage ──▶ binarize ──▶ BitMatrix ──▶ Decoder::decode ──▶ payload
use smart_package_tracker::{Barcode, RenderOptions, scan};

let png = Barcode::code128("PKG-9ED9285C")?.to_png(&RenderOptions::default())?;
assert_eq!(scan::scan_png(&png)?.payload(), "PKG-9ED9285C");

See the scan module for what image conditions that covers, and what it does not.

§Choosing an entropy width

TrackingId::generate defaults to 32 bits of randomness — the familiar PKG-9ED9285C shape — which collides with ~69% probability once 100,000 IDs have been issued. Production systems should configure 64 bits:

use smart_package_tracker::{Checksum, IdGenerator};

let generator = IdGenerator::builder()
    .entropy_bits(64)
    .checksum(Checksum::Iso7064Mod37_36)
    .build()?;

See IdGenerator for the full collision table.

§Feature flags

FeatureDefaultEffect
stdyesFile helpers and std::error::Error. Without it the crate is no_std + alloc.
os-rngyesSeed IDs from the OS CSPRNG. Turn off on targets getrandom does not support; IdGenerator::generate_from_entropy still works.
code128yesCode 128 encoding and decoding.
qryesQR Code encoding. Implies std.
pngyesPNG rendering. Implies std.
svgyesSVG rendering. No extra dependencies.
scanyesRead Code 128 barcodes back out of images. No extra dependencies; implies code128.
serdenoSerialize/Deserialize for the public data types.

§Not yet implemented

Shipment events and carrier integrations are deliberately absent, and belong in separate crates so that network I/O, async runtimes and vendor licence terms stay out of this dependency graph.

Scanning reads linear symbologies only — there is no QR decoder here — and targets rendered labels, flatbed scans and screenshots rather than camera frames. The Symbology, Decoder and Renderer traits are the extension points for new formats.

QR Code is a registered trademark of Denso Wave Incorporated.

Re-exports§

pub use error::Error;
pub use error::Result;
pub use id::Checksum;
pub use id::IdGenerator;
pub use id::IdGeneratorBuilder;
pub use id::TrackingId;
pub use render::hri_supports;
pub use render::Color;
pub use render::Length;
pub use render::QuietZone;
pub use render::RenderOptions;
pub use render::RenderOptionsBuilder;
pub use symbology::Symbol;
pub use symbology::SymbologyKind;
pub use scan::GrayImage;scan
pub use scan::Scan;scan
pub use scan::Scanner;scan
pub use symbology::Code128;code128
pub use symbology::Ecc;qr
pub use symbology::Qr;qr
pub use symbology::QrVersion;qr

Modules§

error
Error types for this crate.
id
Tracking identifiers.
render
Turning Symbols into images.
scanscan
Reading barcodes back out of images.
symbology
Turning payloads into bit patterns.

Structs§

Barcode
An encoded barcode, ready to render.