Async callbacks support is very poor in rust, so using a macro is one of the few ways to have somewhat friendly code.