use std::collections::HashMap;
use crate::{
Error,
command::Font
};
#[derive(Clone, Debug)]
pub enum PrinterConnectionData {
Usb {
vendor_id: u16,
product_id: u16,
endpoint: Option<u8>,
timeout: std::time::Duration
},
Network {
_host: String,
_port: u16
},
Terminal
}
#[derive(Clone, Debug)]
pub struct PrinterProfile {
pub (crate) printer_connection_data: PrinterConnectionData,
pub (crate) columns_per_font: HashMap<Font, u8>,
pub (crate) width: u16
}
impl PrinterProfile {
pub fn new(printer_connection_data: PrinterConnectionData, columns_per_font: HashMap<Font, u8>, width: u16) -> PrinterProfile {
PrinterProfile {
printer_connection_data,
columns_per_font,
width
}
}
pub fn usb_builder(vendor_id: u16, product_id: u16) -> PrinterProfileBuilder {
PrinterProfileBuilder::new_usb(vendor_id, product_id)
}
pub fn terminal_builder() -> PrinterProfileBuilder {
PrinterProfileBuilder::new_terminal()
}
}
pub struct PrinterProfileBuilder {
printer_connection_data: PrinterConnectionData,
columns_per_font: HashMap<Font, u8>,
width: u16
}
impl PrinterProfileBuilder {
pub fn new_usb(vendor_id: u16, product_id: u16) -> PrinterProfileBuilder {
PrinterProfileBuilder {
printer_connection_data: PrinterConnectionData::Usb {
vendor_id,
product_id,
endpoint: None,
timeout: std::time::Duration::from_secs(2)
},
columns_per_font: vec![(Font::FontA, 32)].into_iter().collect(),
width: 384
}
}
pub fn new_terminal() -> PrinterProfileBuilder {
PrinterProfileBuilder {
printer_connection_data: PrinterConnectionData::Terminal,
columns_per_font: vec![(Font::FontA, 32)].into_iter().collect(),
width: 384
}
}
pub fn with_endpoint(mut self, endpoint: u8) -> Result<PrinterProfileBuilder, Error> {
match &mut self.printer_connection_data {
PrinterConnectionData::Usb{endpoint: self_endpoint, ..} => {
*self_endpoint = Some(endpoint);
Ok(self)
},
_other => Err(Error::UnsupportedForPrinterConnection)
}
}
pub fn with_width(mut self, width: u16) -> PrinterProfileBuilder {
self.width = width;
self
}
pub fn with_font_width(mut self, font: Font, width: u8) -> PrinterProfileBuilder {
self.columns_per_font.insert(font, width);
self
}
pub fn with_timeout(mut self, timeout: std::time::Duration) -> Result<PrinterProfileBuilder, Error> {
match &mut self.printer_connection_data {
PrinterConnectionData::Usb{timeout: self_timeout, ..} => {
*self_timeout = timeout;
Ok(self)
},
_other => Err(Error::UnsupportedForPrinterConnection)
}
}
pub fn build(self) -> PrinterProfile {
PrinterProfile {
printer_connection_data: self.printer_connection_data,
columns_per_font: self.columns_per_font,
width: self.width
}
}
}