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();
}