| Name | Message | Date |
|---|---|---|
| 📄 escpos_printer.rs | 1 month ago | |
| 📄 mod.rs | 1 month ago | |
| 📄 receipt_printer_actor.rs | 1 month ago | |
| 📄 receipt_printer_error.rs | 1 month ago |
📄
src/receipt_printer/receipt_printer_actor.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
use std::{sync::Arc, time::Duration}; use escpos::errors::PrinterError; use tokio::{ sync::{mpsc, oneshot}, time::timeout, }; use super::escpos_printer::EscposPrinter; pub struct EscposPrinterActor { host: String, port: u16, printer: Option<EscposPrinter>, receiver: mpsc::UnboundedReceiver<EscposPrinterRequest>, } pub enum EscposPrinterRequest { PrintImage(Arc<[u8]>, oneshot::Sender<Result<(), PrinterError>>), } impl EscposPrinterActor { pub fn run(host: String, port: u16, receiver: mpsc::UnboundedReceiver<EscposPrinterRequest>) { let mut actor = Self { host, port, printer: None, receiver, }; tokio::spawn(async move { loop { let future = timeout(Duration::from_secs(5), actor.receiver.recv()); match future.await { Ok(Some(request)) => { let response_result = match request { EscposPrinterRequest::PrintImage(image, responder) => { responder.send(actor.print_image(&image)) } }; if let Err(error) = response_result { println!("Could not respond to request: {error:?}"); } } Err(_) => actor.disconnect_printer(), Ok(None) => return, } } }); } pub fn print_image(&mut self, image: &[u8]) -> Result<(), PrinterError> { let printer = self.ensure_printer_connection()?; printer.print_image(image) } fn ensure_printer_connection(&mut self) -> Result<&mut EscposPrinter, PrinterError> { let printer = match self.printer.take() { Some(printer) => printer, None => EscposPrinter::open(&self.host, self.port)?, }; Ok(self.printer.insert(printer)) } fn disconnect_printer(&mut self) { _ = self.printer.take(); } }