📄 src/receipt_printer/receipt_printer_error.rs
use std::fmt::Display;

use escpos::errors::PrinterError;
use tokio::sync::{mpsc, oneshot};

use super::receipt_printer_actor::EscposPrinterRequest;

pub struct ReceiptPrinterError {
    variant: ReceiptPrinterErrorVariants,
}

impl ReceiptPrinterError {
    pub fn send(send_error: mpsc::error::SendError<EscposPrinterRequest>) -> Self {
        Self {
            variant: ReceiptPrinterErrorVariants::Send(send_error),
        }
    }
    pub fn receive(recv_error: oneshot::error::RecvError) -> Self {
        Self {
            variant: ReceiptPrinterErrorVariants::Receive(recv_error),
        }
    }
    pub fn printer(printer_error: PrinterError) -> Self {
        Self {
            variant: ReceiptPrinterErrorVariants::Printer(printer_error),
        }
    }
}

enum ReceiptPrinterErrorVariants {
    Send(mpsc::error::SendError<EscposPrinterRequest>),
    Receive(oneshot::error::RecvError),
    Printer(PrinterError),
}

impl Display for ReceiptPrinterError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match &self.variant {
            ReceiptPrinterErrorVariants::Send(send_error) => send_error.fmt(f),
            ReceiptPrinterErrorVariants::Receive(recv_error) => recv_error.fmt(f),
            ReceiptPrinterErrorVariants::Printer(printer_error) => printer_error.fmt(f),
        }
    }
}