📄 src/escpos_printer.rs
use escpos::{
    driver::NetworkDriver,
    errors::PrinterError,
    printer::Printer,
    utils::{BitImageOption, BitImageSize, Protocol},
};

pub struct EscposPrinter {
    printer: Printer<NetworkDriver>,
}

impl EscposPrinter {
    pub const IMAGE_WIDTH_PIXEL: u32 = 72 * 8;
    pub const IMAGE_WIDTH_CM: f32 = 7.2;
    pub const IMAGE_WIDTH_PT: f32 = Self::IMAGE_WIDTH_CM / 0.03527;
    pub const IMAGE_PIXELS_PER_PT: f32 = Self::IMAGE_WIDTH_PIXEL as f32 / Self::IMAGE_WIDTH_PT;

    pub fn open(host: &str, port: u16) -> Result<Self, PrinterError> {
        let driver = NetworkDriver::open(host, port, None)?;
        Ok(Self {
            printer: Printer::new(driver, Protocol::default(), None),
        })
    }

    pub fn print_image(&mut self, image: &[u8]) -> Result<(), PrinterError> {
        self.printer.init()?;
        self.printer.bit_image_from_bytes_option(
            image,
            BitImageOption::new(Some(Self::IMAGE_WIDTH_PIXEL), None, BitImageSize::Normal)?,
        )?;
        self.printer.print_cut()?;
        Ok(())
    }
}