pgx does a lot of that too, but for only pg10/11/12. And then it post-processes the bindings and builds a "common.rs" for symbols that are identical across versions.
That way you can target all three versions at once, and then you can use Rust's #[cfg(feature=)] directive to opt into support for specific versions.
pgx has also done a little bit of work to mask differences between the three versions so they appear as part of "common.rs" anyways.
I wanted a framework that let me know, at development time, if I was trying to do a thing that isn't supported (or the same) across various PG versions.
"R(Rust) PG(Postgresql) FFI (Foreign Function Interface)"