PostgreSQLのパーサを使う
PostgreSQL内部のパーサのみを扱うCのライブラリがある
これもとにした様々な言語のバインディングがあり、Rust版がこれ
それを単純にCLIにしたものがこれ
pg_query.rs を依存に持ち、パーサを呼び出すだけ
引数にファイルを受け取り、その内容をパースする
シンタックスエラーがあれば失敗する
Linux でビルドするときはcmakeとかllvmのインストールが必要なだけだった
MinGWのときはヘッダファイルの場所をccクレートが見つけられていないらしく、pg_query.rs/build.rs のビルド時引数に対して直接場所を追加してみたら動いた
code:pg_query.rs/build.rs.diff
// Generate bindings for Rust
bindgen::Builder::default()
.header(out_header_path.to_str().ok_or("Invalid header path")?)
+ .clang_args(&[
+ "--target=x86_64-pc-windows-gnu",
+ "--sysroot=C:\\Users\\<username>\\x86_64-13.2.0-release-win32-seh-ucrt-rt_v11-rev0\\mingw64",
+ ])
.generate()
.map_err(|_| "Unable to generate bindings")?
.write_to_file(out_dir.join("bindings.rs"))?;