ys memos

Blog

RustのWASMでprintln的にlogをする


rust

2023/08/04


RustはWASMへのコンパイルができることで知られている。

また、普段のRustの開発においては、必要に応じてprintln!マクロを使ってターミナルにログ出力可能。

WASM開発においても同様にログ出力が行えるように、println!同様の扱い方ができるマクロを作った。



依存パッケージに以下の行を追加する

Cargo.toml
wasm-bindgen = "0.2"

全体像ではないが、以下のようにファイルが配置されているとする。

src以下
src/
├── main.rs
└── util
    ├── log.rs
    └── mod.rs

必要に応じてWASMを生成するコードを記述。


マクロを利用するときにcrateからたどるためにpubにする。

mod.rs
pub mod log;

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で色々したい。


関連タグを探す