datamatrix 0.3.2

Data Matrix (ECC 200) decoding and encoding with an optimizing encoder
Documentation
use std::fmt::Write;

use datamatrix::{
    placement::{Bitmap, PathSegment},
    DataMatrix, SymbolList,
};

fn bitmap_to_eps(bitmap: Bitmap<bool>) -> String {
    let w = bitmap.width();
    let h = bitmap.height();
    let mut eps: String = format!(
        concat!(
            "%!PS-Adobe-2.0 EPSF-3.0\n",
            "%%BoundingBox: 0 0 {} {}\n",
            "%%EndComments\n",
            "%%BeginProlog\n",
            "4 dict begin\n",
            "/h {{ 0 rlineto }} bind def\n",
            "/v {{ 0 exch rlineto }} bind def\n",
            "/z {{ closepath }} bind def\n",
            "/m {{ rmoveto }} bind def\n",
            "%%EndProlog\n",
            "gsave\n",
            "1 {} moveto\n",
        ),
        w + 2,
        h + 2,
        h + 1,
    );
    for part in bitmap.path() {
        match part {
            PathSegment::Horizontal(n) => write!(eps, "{} h\n", n),
            PathSegment::Vertical(n) => write!(eps, "{} v\n", -n),
            PathSegment::Move(dx, dy) => write!(eps, "{} {} m\n", dx, -dy),
            PathSegment::Close => write!(eps, "z\n"),
        }
        .unwrap();
    }
    eps.push_str("eofill\ngrestore");
    eps
}

fn main() {
    let bitmap = DataMatrix::encode(b"Hello, EPS!", SymbolList::default().enforce_rectangular())
        .unwrap()
        .bitmap();
    println!("{}", bitmap_to_eps(bitmap));
}