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