1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
extern crate proc_macro; use proc_macro::TokenStream; #[proc_macro] pub fn pg_function_info_v1(item: TokenStream) -> TokenStream { let name = item.to_string(); let v1_cc_name = format!("pg_finfo_{}", name); let panic_handler_name = format!("rs_panic_handler_{}", name); let v1_cc_code = format!(r###" #[export_name="{v1_cc_name}"] pub extern "C" fn {v1_cc_name}() -> &'static postgres_extension::fmgr::Pg_finfo_record {{ return &postgres_extension::fmgr::PG_FUNCTION_INFO_V1_DATA; }} "###, v1_cc_name = v1_cc_name); let panic_handler_code = format!(r###" #[export_name="{name}"] pub extern "C" fn {panic_handler_name}( fcinfo : postgres_extension::fmgr::FunctionCallInfo) -> Datum {{ rust_panic_handler!({name}(fcinfo)) }} "###, name=name, panic_handler_name=panic_handler_name); let code = format!("{v1_cc_code}\n{panic_handler_code}\n", v1_cc_code = v1_cc_code, panic_handler_code = panic_handler_code); return code.parse().unwrap(); }