use windows::core::HRESULT;
use windows::Win32::Foundation::{ERROR_PRINT_CANCELLED, E_FAIL};
use windows::Win32::Storage::Xps::Printing::{
PrintDocumentPackageCompletion, PrintDocumentPackageCompletion_Canceled,
PrintDocumentPackageCompletion_Completed, PrintDocumentPackageCompletion_Failed,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum PrintOutcome {
Completed,
Canceled,
}
pub(crate) fn deleted_from_queue(code: HRESULT) -> bool {
code == HRESULT::from_win32(ERROR_PRINT_CANCELLED.0)
}
#[allow(non_upper_case_globals)]
pub(crate) fn pipeline_outcome(
completion: PrintDocumentPackageCompletion,
status: HRESULT,
) -> Option<Result<PrintOutcome, windows::core::Error>> {
match completion {
PrintDocumentPackageCompletion_Completed => Some(Ok(PrintOutcome::Completed)),
PrintDocumentPackageCompletion_Canceled => Some(Ok(PrintOutcome::Canceled)),
PrintDocumentPackageCompletion_Failed if deleted_from_queue(status) => {
Some(Ok(PrintOutcome::Canceled))
}
PrintDocumentPackageCompletion_Failed => Some(Err(windows::core::Error::from_hresult(
Some(status)
.filter(|status| status.is_err())
.unwrap_or(E_FAIL),
))),
_ => None,
}
}