blob: 86c3b4ea30c6c1284ea69cffa9830f09dce4b641 [file] [log] [blame]
//!
//! IPP operation builders
//!
use http::Uri;
use crate::{
attribute::IppAttribute,
operation::{cups::*, *},
payload::IppPayload,
};
/// Builder to create IPP operations
pub struct IppOperationBuilder;
impl IppOperationBuilder {
/// Create Print-Job operation
///
/// * `printer_uri` - printer URI<br/>
/// * `payload` - `IppPayload`
pub fn print_job(printer_uri: Uri, payload: IppPayload) -> PrintJobBuilder {
PrintJobBuilder::new(printer_uri, payload)
}
/// Create Get-Printer-Attributes operation builder
///
/// * `printer_uri` - printer URI
pub fn get_printer_attributes(printer_uri: Uri) -> GetPrinterAttributesBuilder {
GetPrinterAttributesBuilder::new(printer_uri)
}
/// Create Create-Job operation builder
///
/// * `printer_uri` - printer URI
pub fn create_job(printer_uri: Uri) -> CreateJobBuilder {
CreateJobBuilder::new(printer_uri)
}
/// Create CUPS-specific operations
pub fn cups() -> CupsBuilder {
CupsBuilder::new()
}
/// Create Send-Document operation builder
///
/// * `printer_uri` - printer URI<br/>
/// * `job_id` - job id returned by Create-Job operation <br/>
/// * `payload` - `IppPayload`
pub fn send_document(printer_uri: Uri, job_id: i32, payload: IppPayload) -> SendDocumentBuilder {
SendDocumentBuilder::new(printer_uri, job_id, payload)
}
/// Create Purge-Jobs operation builder
///
/// * `printer_uri` - printer URI
pub fn purge_jobs(printer_uri: Uri) -> PurgeJobsBuilder {
PurgeJobsBuilder::new(printer_uri)
}
/// Create Cancel-Job operation builder
///
/// * `printer_uri` - printer URI
/// * `job_id` - job id to cancel <br/>
pub fn cancel_job(printer_uri: Uri, job_id: i32) -> CancelJobBuilder {
CancelJobBuilder::new(printer_uri, job_id)
}
/// Create Get-Job-Attributes operation builder
///
/// * `printer_uri` - printer URI
/// * `job_id` - job id to cancel <br/>
pub fn get_job_attributes(printer_uri: Uri, job_id: i32) -> GetJobAttributesBuilder {
GetJobAttributesBuilder::new(printer_uri, job_id)
}
/// Create Get-Jobs operation builder
///
/// * `printer_uri` - printer URI
pub fn get_jobs(printer_uri: Uri) -> GetJobsBuilder {
GetJobsBuilder::new(printer_uri)
}
}
/// Builder to create Print-Job operation
pub struct PrintJobBuilder {
printer_uri: Uri,
payload: IppPayload,
user_name: Option<String>,
job_title: Option<String>,
document_format: Option<String>,
attributes: Vec<IppAttribute>,
}
impl PrintJobBuilder {
fn new(printer_uri: Uri, payload: IppPayload) -> PrintJobBuilder {
PrintJobBuilder {
printer_uri,
payload,
user_name: None,
job_title: None,
document_format: None,
attributes: Vec::new(),
}
}
/// Specify requesting-user-name attribute
pub fn user_name<S>(mut self, user_name: S) -> Self
where
S: AsRef<str>,
{
self.user_name = Some(user_name.as_ref().to_owned());
self
}
/// Specify job-name attribute
pub fn job_title<S>(mut self, job_title: S) -> Self
where
S: AsRef<str>,
{
self.job_title = Some(job_title.as_ref().to_owned());
self
}
/// Specify the mime-type of the document, e.g. "image/jpeg"
pub fn document_format<S>(mut self, document_format: S) -> Self
where
S: AsRef<str>,
{
self.document_format = Some(document_format.as_ref().to_owned());
self
}
/// Specify custom job attribute
pub fn attribute(mut self, attribute: IppAttribute) -> Self {
self.attributes.push(attribute);
self
}
/// Specify custom job attributes
pub fn attributes<I>(mut self, attributes: I) -> Self
where
I: IntoIterator<Item = IppAttribute>,
{
self.attributes.extend(attributes);
self
}
/// Build operation
pub fn build(self) -> impl IppOperation {
let op = PrintJob::new(
self.printer_uri,
self.payload,
self.user_name.as_ref(),
self.job_title.as_ref(),
self.document_format.as_ref(),
);
self.attributes.into_iter().fold(op, |mut op, attr| {
op.add_attribute(attr);
op
})
}
}
/// Builder to create Get-Printer-Attributes operation
pub struct GetPrinterAttributesBuilder {
printer_uri: Uri,
attributes: Vec<String>,
}
impl GetPrinterAttributesBuilder {
fn new(printer_uri: Uri) -> GetPrinterAttributesBuilder {
GetPrinterAttributesBuilder {
printer_uri,
attributes: Vec::new(),
}
}
/// Specify which attribute to retrieve from the printer. Can be repeated.
pub fn attribute<S>(mut self, attribute: S) -> Self
where
S: AsRef<str>,
{
self.attributes.push(attribute.as_ref().to_owned());
self
}
/// Specify which attributes to retrieve from the printer
pub fn attributes<S, I>(mut self, attributes: I) -> Self
where
S: AsRef<str>,
I: IntoIterator<Item = S>,
{
self.attributes
.extend(attributes.into_iter().map(|s| s.as_ref().to_string()));
self
}
/// Build operation
pub fn build(self) -> impl IppOperation {
GetPrinterAttributes::with_attributes(self.printer_uri, &self.attributes)
}
}
/// Builder to create Create-Job operation
pub struct CreateJobBuilder {
printer_uri: Uri,
job_name: Option<String>,
attributes: Vec<IppAttribute>,
}
impl CreateJobBuilder {
fn new(printer_uri: Uri) -> CreateJobBuilder {
CreateJobBuilder {
printer_uri,
job_name: None,
attributes: Vec::new(),
}
}
/// Specify job-name attribute
pub fn job_name<S>(mut self, job_name: S) -> Self
where
S: AsRef<str>,
{
self.job_name = Some(job_name.as_ref().to_owned());
self
}
/// Specify custom job attribute
pub fn attribute(mut self, attribute: IppAttribute) -> Self {
self.attributes.push(attribute);
self
}
/// Specify custom job attributes
pub fn attributes<I>(mut self, attributes: I) -> Self
where
I: IntoIterator<Item = IppAttribute>,
{
self.attributes.extend(attributes);
self
}
/// Build operation
pub fn build(self) -> impl IppOperation {
let op = CreateJob::new(self.printer_uri, self.job_name.as_ref());
self.attributes.into_iter().fold(op, |mut op, attr| {
op.add_attribute(attr);
op
})
}
}
/// Builder to create Send-Document operation
pub struct SendDocumentBuilder {
printer_uri: Uri,
job_id: i32,
payload: IppPayload,
user_name: Option<String>,
document_format: Option<String>,
is_last: bool,
}
impl SendDocumentBuilder {
fn new(printer_uri: Uri, job_id: i32, payload: IppPayload) -> SendDocumentBuilder {
SendDocumentBuilder {
printer_uri,
job_id,
payload,
user_name: None,
document_format: None,
is_last: true,
}
}
/// Specify originating-user-name attribute
pub fn user_name<S>(mut self, user_name: S) -> Self
where
S: AsRef<str>,
{
self.user_name = Some(user_name.as_ref().to_owned());
self
}
/// Specify the mime-type of the document, e.g. "image/jpeg"
pub fn document_format<S>(mut self, document_format: S) -> Self
where
S: AsRef<str>,
{
self.document_format = Some(document_format.as_ref().to_owned());
self
}
/// Parameter which indicates whether this document is a last one
pub fn last(mut self, last: bool) -> Self {
self.is_last = last;
self
}
/// Build operation
pub fn build(self) -> impl IppOperation {
SendDocument::new(
self.printer_uri,
self.job_id,
self.payload,
self.user_name.as_ref(),
self.document_format.as_ref(),
self.is_last,
)
}
}
/// Builder to create Purge-Jobs operation
pub struct PurgeJobsBuilder {
printer_uri: Uri,
user_name: Option<String>,
}
impl PurgeJobsBuilder {
fn new(printer_uri: Uri) -> PurgeJobsBuilder {
PurgeJobsBuilder {
printer_uri,
user_name: None,
}
}
/// Specify originating-user-name attribute
pub fn user_name<S>(mut self, user_name: S) -> Self
where
S: AsRef<str>,
{
self.user_name = Some(user_name.as_ref().to_owned());
self
}
/// Build operation
pub fn build(self) -> impl IppOperation {
PurgeJobs::new(self.printer_uri, self.user_name)
}
}
/// Builder to create Cancel-Job operation
pub struct CancelJobBuilder {
printer_uri: Uri,
job_id: i32,
user_name: Option<String>,
}
impl CancelJobBuilder {
fn new(printer_uri: Uri, job_id: i32) -> CancelJobBuilder {
CancelJobBuilder {
printer_uri,
job_id,
user_name: None,
}
}
/// Specify originating-user-name attribute
pub fn user_name<S>(mut self, user_name: S) -> Self
where
S: AsRef<str>,
{
self.user_name = Some(user_name.as_ref().to_owned());
self
}
/// Build operation
pub fn build(self) -> impl IppOperation {
CancelJob::new(self.printer_uri, self.job_id, self.user_name)
}
}
/// Builder to create Get-Job-Attributes operation
pub struct GetJobAttributesBuilder {
printer_uri: Uri,
job_id: i32,
user_name: Option<String>,
}
impl GetJobAttributesBuilder {
fn new(printer_uri: Uri, job_id: i32) -> GetJobAttributesBuilder {
GetJobAttributesBuilder {
printer_uri,
job_id,
user_name: None,
}
}
/// Specify originating-user-name attribute
pub fn user_name<S>(mut self, user_name: S) -> Self
where
S: AsRef<str>,
{
self.user_name = Some(user_name.as_ref().to_owned());
self
}
/// Build operation
pub fn build(self) -> impl IppOperation {
GetJobAttributes::new(self.printer_uri, self.job_id, self.user_name)
}
}
/// Builder to create Get-Jobs operation
pub struct GetJobsBuilder {
printer_uri: Uri,
user_name: Option<String>,
}
impl GetJobsBuilder {
fn new(printer_uri: Uri) -> GetJobsBuilder {
GetJobsBuilder {
printer_uri,
user_name: None,
}
}
/// Specify originating-user-name attribute
pub fn user_name<S>(mut self, user_name: S) -> Self
where
S: AsRef<str>,
{
self.user_name = Some(user_name.as_ref().to_owned());
self
}
/// Build operation
pub fn build(self) -> impl IppOperation {
GetJobs::new(self.printer_uri, self.user_name)
}
}
/// CUPS operations builder
pub struct CupsBuilder;
impl CupsBuilder {
fn new() -> CupsBuilder {
CupsBuilder
}
/// CUPS-Get-Printers operation
pub fn get_printers(&self) -> impl IppOperation {
CupsGetPrinters::new()
}
/// CUPS-Delete-Printer operation
pub fn delete_printer(&self, printer_uri: Uri) -> impl IppOperation {
CupsDeletePrinter::new(printer_uri)
}
}