postgres_extension_macro/
lib.rs

1extern 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}