見出し画像

今日の学び #13 2025-06-01

Rust(Tauri)

Tauriを通してRustに入門しました。

感想としては、ChatGPTがRustの事をいろいろ知ってたので、勉強するのが楽だった。

データの構造で型が推論されるTypeScriptと違って、Rustは(継承を除けば)名前が違えば別の型として扱う公称型と言われる静的型付け言語で、Java以来久しぶりに書きました。

フロントとの通信

Rustとフロント(vue.js)のやり取りは、Rust側で作った関数をフロントから呼び出せるような感じです。

こんなふうにgreet関数がRust側にあって(#で始まっているのは継承)

#[tauri::command]
fn greet(name: &str) -> String {
    format!("Hello, {}! You've been greeted from Rust!", name)
}

main内でその関数をハンドラーとして登録

fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![greet])
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}

するとフロント(JS)からinvokeを使って呼び出せます。

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

const files = await invoke('greet', { name: 'HOGE' })

Result型

Rust標準の型のResultというものがあり、それが面白かった。

ファイル読み込みのような、エラーになる可能性のある処理の返り値として使える型で、その処理が失敗か成功かの2パターンを内部で持つ。
処理を呼び出す側としては、処理の結果を一旦Result型で受け取り、その後で中身をチェックして処理を進めることになる。
以下のコードだと、load_fileの結果がresultに入り、2行目のmatch式で処理が成功した場合とエラーになった場合とで返す値を変えている。(どちらもFileという構造体を返すが、ファイルが読み込めなかった場合はexistsがfalse)

let result = load_file(file_path);
let file: File = match result {
		Ok(_doc) => File {
				exists: true,
				path: file_path,
		},
		Err(_e) => File {
				exists: false,
				path: file_path.to_string(),
		},
};

JSやPHPだとこういう仕組みを自前で作ったりするので、デフォルトでこれがあるのが便利。

そして、今回はPDFを操作するようなものを作りたいので、lopdfというものを使っています。


この記事が気に入ったらサポートをしてみませんか?