プリンターの一覧を取得する

Recipe ID: hw-009

システムにインストールされているプリンターの一覧を Rust 側で取得します。printers クレートがシンプルで便利です。

1. 依存関係の追加

src-tauri ディレクトリに移動して、以下のコマンドを実行します。

cargo add printers

printers クレートは一部の環境でメンテナンスが古い場合があるため、動作しない場合はシステムコマンド(lpstat や PowerShell)を実行する方法(rust-024 参照)への切り替えも検討してください。

2. 実装コード

#[derive(serde::Serialize)]
struct PrinterInfo {
    name: String,
    system_name: String,  // 一意識別子として使用可能
    is_default: bool,
    // uri, driver_name なども取得可能
}

#[tauri::command]
fn list_printers() -> Result<Vec<PrinterInfo>, String> {
    let printers = printers::get_printers();
    
    let result = printers.into_iter().map(|p| {
        PrinterInfo {
            name: p.name,
            system_name: p.system_name,
            is_default: p.is_default,
        }
    }).collect();

    Ok(result)
}

3. 実装(フロントエンド側)

import { invoke } from '@tauri-apps/api/core';

interface PrinterInfo {
  name: string;
  system_name: string;  // 一意識別子として使用可能
  is_default: boolean;
}

async function getPrinters() {
  const printers = await invoke<PrinterInfo[]>('list_printers');
  console.log('プリンター一覧:', printers);
  return printers;
}

4. 注意点

  • macOS (CUPS) や Windows のスプーラサービスが動作している必要があります。
  • Webview (JavaScript) から直接プリンター一覧を取得する標準 API は存在しません(セキュリティのため)。必ず Rust 経由で行う必要があります。