2023/08/04
はじめに
RustはWASMへのコンパイルができることで知られている。
また、普段のRustの開発においては、必要に応じてprintln!
マクロを使ってターミナルにログ出力可能。
WASM開発においても同様にログ出力が行えるように、println!
同様の扱い方ができるマクロを作った。
実装
ディレクトリ構造
依存パッケージに以下の行を追加する
Cargo.toml
wasm-bindgen = "0.2"
全体像ではないが、以下のようにファイルが配置されているとする。
src以下
src/
├── main.rs
└── util
├── log.rs
└── mod.rs
main.rs
必要に応じてWASMを生成するコードを記述。
util/mod.rs
マクロを利用するときにcrate
からたどるためにpub
にする。
mod.rs
pub mod log;
util/log.rs
log.rs
use wasm_bindgen::prelude::wasm_bindgen;
#[wasm_bindgen]
extern "C" {
#[wasm_bindgen(js_namespace = console)]
pub(crate) fn log(s: String);
}
#[macro_export]
macro_rules! log {
() => {{
$crate::util::log::log("\n".to_string())
}};
($($arg:tt)*) => {{
let s = format!($($arg)*);
$crate::util::log::log(s)
}};
}
呼び出し方法
WASMの実行などは省略するが、ログを残すのは以下のようなコードで可能となる。
use crate::log;
fn display_log() {
for i in 0..10 {
log!("test log {}", i);
}
}
これがブラウザで実行されると、以下のようなログが出力される。
test log 0
test log 1
test log 2
test log 3
test log 4
test log 5
test log 6
test log 7
test log 8
test log 9
おわりに
Rust+WASMで色々したい。