mod declare;
mod fsys;
mod windows;
use tauri::{
plugin::{Builder, TauriPlugin},
Manager, Runtime,
};
use std::env;
pub use crate::models::*;
use crate::declare::{PrintHtmlOptions, PrintPdfUrlOptions};
#[cfg(desktop)]
mod desktop;
#[cfg(mobile)]
mod mobile;
mod error;
mod models;
pub use error::{Error, Result};
#[cfg(desktop)]
use desktop::Printer;
#[cfg(mobile)]
use mobile::Printer;
#[tauri::command]
async fn ping<R: Runtime>(app: tauri::AppHandle<R>, payload: PingRequest) -> Result<PingResponse> {
app.printer().ping(payload)
}
#[tauri::command(rename_all = "snake_case")]
async fn print_html<R: Runtime>(app: tauri::AppHandle<R>, options: PrintHtmlOptions) -> Result<String> {
println!("print_html: {:?}", options.print_settings);
app.printer().print_html(options)
}
pub trait PrinterExt<R: Runtime> {
fn printer(&self) -> &Printer<R>;
}
impl<R: Runtime, T: Manager<R>> crate::PrinterExt<R> for T {
fn printer(&self) -> &Printer<R> {
self.state::<Printer<R>>().inner()
}
}
#[tauri::command(rename_all = "snake_case")]
fn create_temp_file(buffer_data: String, filename: String) -> String {
let dir = env::temp_dir();
let result = fsys::create_file_from_base64(
buffer_data.as_str(),
format!("{}{}", dir.display(), filename).as_str(),
);
if result.is_ok() {
return format!("{}{}", dir.display(), filename);
}
return "".to_owned();
}
#[tauri::command(rename_all = "snake_case")]
fn remove_temp_file(filename: String) -> bool {
let dir = env::temp_dir();
let result = fsys::remove_file(format!("{}{}", dir.display(), filename).as_str());
if result.is_ok() {
return true;
}
return false;
}
#[tauri::command]
fn get_printers() -> String {
if cfg!(windows) {
return windows::get_printers();
}
return "Unsupported OS".to_string();
}
#[tauri::command(rename_all = "snake_case")]
fn get_printers_by_name(printername: String) -> String {
println!("获取打印机列表: {}", printername);
if cfg!(windows) {
return windows::get_printers_by_name(printername);
}
return "Unsupported OS".to_string();
}
#[tauri::command(rename_all = "snake_case")]
fn print_pdf(
id: String,
path: String,
printer: String,
print_settings: String,
remove_after_print: Option<bool>,
) -> String {
if cfg!(windows) {
let options = declare::PrintOptions {
id,
path,
printer,
print_settings,
remove_after_print,
};
return windows::print_pdf(options);
}
return "Unsupported OS".to_string();
}
#[tauri::command(rename_all = "snake_case")]
fn print_pdf_from_url(
id: String,
url: String,
printer: String,
print_settings: String,
remove_after_print: Option<bool>,
timeout_seconds: Option<u64>,
temp_dir: Option<String>,
) -> String {
if cfg!(windows) {
let options = PrintPdfUrlOptions {
id,
url,
printer,
print_settings,
remove_after_print,
timeout_seconds,
temp_dir,
};
return windows::print_pdf_from_url(options);
}
return "Unsupported OS".to_string();
}
#[tauri::command(rename_all = "snake_case")]
fn get_jobs(printername: String) -> String {
if cfg!(windows) {
return windows::get_jobs(printername);
}
return "Unsupported OS".to_string();
}
#[tauri::command(rename_all = "snake_case")]
fn get_jobs_by_id(printername: String, jobid: String) -> String {
if cfg!(windows) {
return windows::get_jobs_by_id(printername, jobid);
}
return "Unsupported OS".to_string();
}
#[tauri::command(rename_all = "snake_case")]
fn resume_job(printername: String, jobid: String) -> String {
if cfg!(windows) {
return windows::resume_job(printername, jobid);
}
return "Unsupported OS".to_string();
}
#[tauri::command(rename_all = "snake_case")]
fn restart_job(printername: String, jobid: String) -> String {
if cfg!(windows) {
return windows::restart_job(printername, jobid);
}
return "Unsupported OS".to_string();
}
#[tauri::command(rename_all = "snake_case")]
fn pause_job(printername: String, jobid: String) -> String {
if cfg!(windows) {
return windows::pause_job(printername, jobid);
}
return "Unsupported OS".to_string();
}
#[tauri::command(rename_all = "snake_case")]
fn remove_job(printername: String, jobid: String) -> String {
if cfg!(windows) {
return windows::remove_job(printername, jobid);
}
return "Unsupported OS".to_string();
}
pub fn custom_get_printers_by_name(printername: String) -> String {
if cfg!(windows) {
return windows::get_printers_by_name(printername);
}
return "Unsupported OS".to_string();
}
pub fn custom_print_pdf(
id: String,
path: String,
printer: String,
print_settings: String,
remove_after_print: Option<bool>,
) -> String {
if cfg!(windows) {
let options = declare::PrintOptions {
id,
path,
printer,
print_settings,
remove_after_print,
};
return windows::print_pdf(options);
}
return "Unsupported OS".to_string();
}
pub fn init<R: Runtime>() -> TauriPlugin<R> {
if cfg!(windows) {
windows::init_windows();
}
Builder::new("printer")
.invoke_handler(tauri::generate_handler![
ping,
print_html,
create_temp_file,
remove_temp_file,
get_printers,
get_printers_by_name,
print_pdf,
print_pdf_from_url,
get_jobs,
get_jobs_by_id,
resume_job,
restart_job,
pause_job,
remove_job
])
.setup(|app, api| {
#[cfg(mobile)]
let printer = mobile::init(app, api)?;
#[cfg(desktop)]
let printer = desktop::init(app, api)?;
app.manage(printer);
Ok(())
})
.build()
}