cups_rs 0.3.0

Rust bindings for CUPS (Common UNIX Printing System)
Documentation
use std::fmt;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum JobStatus {
    Pending,
    Processing,
    Completed,
    Canceled,
    Aborted,
    Held,
    Stopped,
    Unknown,
}

impl JobStatus {
    pub fn from_cups_state(state: i32) -> Self {
        match state as u32 {
            crate::bindings::ipp_jstate_e_IPP_JSTATE_PENDING => JobStatus::Pending,
            crate::bindings::ipp_jstate_e_IPP_JSTATE_PROCESSING => JobStatus::Processing,
            crate::bindings::ipp_jstate_e_IPP_JSTATE_COMPLETED => JobStatus::Completed,
            crate::bindings::ipp_jstate_e_IPP_JSTATE_CANCELED => JobStatus::Canceled,
            crate::bindings::ipp_jstate_e_IPP_JSTATE_ABORTED => JobStatus::Aborted,
            crate::bindings::ipp_jstate_e_IPP_JSTATE_HELD => JobStatus::Held,
            crate::bindings::ipp_jstate_e_IPP_JSTATE_STOPPED => JobStatus::Stopped,
            _ => JobStatus::Unknown,
        }
    }

    pub fn to_cups_value(&self) -> i32 {
        match self {
            JobStatus::Pending => crate::bindings::ipp_jstate_e_IPP_JSTATE_PENDING as i32,
            JobStatus::Processing => crate::bindings::ipp_jstate_e_IPP_JSTATE_PROCESSING as i32,
            JobStatus::Completed => crate::bindings::ipp_jstate_e_IPP_JSTATE_COMPLETED as i32,
            JobStatus::Canceled => crate::bindings::ipp_jstate_e_IPP_JSTATE_CANCELED as i32,
            JobStatus::Aborted => crate::bindings::ipp_jstate_e_IPP_JSTATE_ABORTED as i32,
            JobStatus::Held => crate::bindings::ipp_jstate_e_IPP_JSTATE_HELD as i32,
            JobStatus::Stopped => crate::bindings::ipp_jstate_e_IPP_JSTATE_STOPPED as i32,
            JobStatus::Unknown => 0,
        }
    }
}

impl fmt::Display for JobStatus {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        match self {
            JobStatus::Pending => write!(f, "Pending"),
            JobStatus::Processing => write!(f, "Processing"),
            JobStatus::Completed => write!(f, "Completed"),
            JobStatus::Canceled => write!(f, "Canceled"),
            JobStatus::Aborted => write!(f, "Aborted"),
            JobStatus::Held => write!(f, "Held"),
            JobStatus::Stopped => write!(f, "Stopped"),
            JobStatus::Unknown => write!(f, "Unknown"),
        }
    }
}

#[derive(Debug, Clone)]
pub struct JobInfo {
    pub id: i32,
    pub title: String,
    pub user: String,
    pub dest: String,
    pub status: JobStatus,
    pub size: i32,
    pub priority: i32,
    pub creation_time: i64,
    pub processing_time: i64,
    pub completed_time: i64,
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn test_job_status_from_cups_state() {
        use crate::bindings::*;
        assert_eq!(JobStatus::from_cups_state(ipp_jstate_e_IPP_JSTATE_PENDING as i32), JobStatus::Pending);
        assert_eq!(JobStatus::from_cups_state(ipp_jstate_e_IPP_JSTATE_PROCESSING as i32), JobStatus::Processing);
        assert_eq!(JobStatus::from_cups_state(ipp_jstate_e_IPP_JSTATE_COMPLETED as i32), JobStatus::Completed);
        assert_eq!(JobStatus::from_cups_state(ipp_jstate_e_IPP_JSTATE_CANCELED as i32), JobStatus::Canceled);
        assert_eq!(JobStatus::from_cups_state(ipp_jstate_e_IPP_JSTATE_ABORTED as i32), JobStatus::Aborted);
        assert_eq!(JobStatus::from_cups_state(ipp_jstate_e_IPP_JSTATE_HELD as i32), JobStatus::Held);
        assert_eq!(JobStatus::from_cups_state(ipp_jstate_e_IPP_JSTATE_STOPPED as i32), JobStatus::Stopped);
        assert_eq!(JobStatus::from_cups_state(999), JobStatus::Unknown);
    }

    #[test]
    fn test_job_status_to_cups_value() {
        use crate::bindings::*;
        assert_eq!(JobStatus::Pending.to_cups_value(), ipp_jstate_e_IPP_JSTATE_PENDING as i32);
        assert_eq!(JobStatus::Processing.to_cups_value(), ipp_jstate_e_IPP_JSTATE_PROCESSING as i32);
        assert_eq!(JobStatus::Completed.to_cups_value(), ipp_jstate_e_IPP_JSTATE_COMPLETED as i32);
        assert_eq!(JobStatus::Canceled.to_cups_value(), ipp_jstate_e_IPP_JSTATE_CANCELED as i32);
        assert_eq!(JobStatus::Aborted.to_cups_value(), ipp_jstate_e_IPP_JSTATE_ABORTED as i32);
        assert_eq!(JobStatus::Held.to_cups_value(), ipp_jstate_e_IPP_JSTATE_HELD as i32);
        assert_eq!(JobStatus::Stopped.to_cups_value(), ipp_jstate_e_IPP_JSTATE_STOPPED as i32);
        assert_eq!(JobStatus::Unknown.to_cups_value(), 0);
    }

    #[test]
    fn test_job_status_display() {
        assert_eq!(JobStatus::Pending.to_string(), "Pending");
        assert_eq!(JobStatus::Processing.to_string(), "Processing");
        assert_eq!(JobStatus::Completed.to_string(), "Completed");
        assert_eq!(JobStatus::Canceled.to_string(), "Canceled");
        assert_eq!(JobStatus::Aborted.to_string(), "Aborted");
        assert_eq!(JobStatus::Held.to_string(), "Held");
        assert_eq!(JobStatus::Stopped.to_string(), "Stopped");
        assert_eq!(JobStatus::Unknown.to_string(), "Unknown");
    }

    #[test]
    fn test_job_info_creation() {
        let job_info = JobInfo {
            id: 123,
            title: "Test Job".to_string(),
            user: "testuser".to_string(),
            dest: "TestPrinter".to_string(),
            status: JobStatus::Processing,
            size: 1024,
            priority: 50,
            creation_time: 1640995200,
            processing_time: 1640995260,
            completed_time: 0,
        };

        assert_eq!(job_info.id, 123);
        assert_eq!(job_info.title, "Test Job");
        assert_eq!(job_info.status, JobStatus::Processing);
    }
}