1use crate::{Error, Printer, PrinterInterface};
2
3mod d460bt;
4mod finalize;
5mod info;
6mod packbits;
7mod precut;
8mod raster_start;
9mod rasterline;
10mod status;
11
12use d460bt::D490bt;
13use finalize::Finalize;
14use image::DynamicImage;
15use info::Info;
16use nom::Err;
17use packbits::PackBits;
18use precut::Precut;
19use raster_start::RasterStart;
20use rasterline::RasterLine;
21pub use status::Status;
22
23pub struct Commands;
24
25impl Commands {
26 pub async fn pack_bits(printer: &Printer) -> Result<(), Error> {
27 printer.send(PackBits::message()).await
28 }
29
30 async fn status_internal(printer: &PrinterInterface, attempt: i32) -> Result<Status, Error> {
31 Box::pin(async move {
32 let buf = printer.receive(Status::message()).await?;
33 let status = Status::from_request(buf);
34
35 match status {
36 Ok(status) => Ok(status),
37 Err(Error::Nom(Err::Error(err))) if err.input.is_empty() && attempt > 0 => {
38 Commands::status_internal(printer, attempt - 1).await
39 },
40 Err(err) => Err(err)?,
41 }
42 })
43 .await
44 }
45
46 pub(crate) async fn status(printer: &PrinterInterface) -> Result<Status, Error> {
47 Commands::status_internal(printer, 10).await
48 }
49
50 pub async fn info(printer: &Printer, size_x: u32) -> Result<(), Error> {
51 Info::message(printer, size_x).await
52 }
53
54 pub async fn raster_start(printer: &Printer) -> Result<(), Error> {
55 RasterStart::message(printer).await
56 }
57
58 pub async fn d460bt_magic(printer: &Printer, chain: bool) -> Result<(), Error> {
59 D490bt::message(printer, chain).await
60 }
61
62 pub async fn precut(printer: &Printer, precut: bool) -> Result<(), Error> {
63 Precut::message(printer, precut).await
64 }
65
66 pub async fn raster_line(printer: &Printer, image: DynamicImage) -> Result<(), Error> {
67 RasterLine::message(printer, image).await
68 }
69
70 pub async fn finalize(printer: &Printer, chain: bool) -> Result<(), Error> {
71 Finalize::message(printer, chain).await
72 }
73}