pgx_utils/sql_entity_graph/schema/
mod.rs1pub mod entity;
18
19use proc_macro2::{Span, TokenStream as TokenStream2};
20use quote::{quote, ToTokens, TokenStreamExt};
21use std::hash::{Hash, Hasher};
22use syn::parse::{Parse, ParseStream};
23use syn::ItemMod;
24
25#[derive(Debug, Clone)]
45pub struct Schema {
46 pub module: ItemMod,
47}
48
49impl Parse for Schema {
50 fn parse(input: ParseStream) -> Result<Self, syn::Error> {
51 let module: ItemMod = input.parse()?;
52 crate::ident_is_acceptable_to_postgres(&module.ident)?;
53 Ok(Self { module })
54 }
55}
56
57impl ToTokens for Schema {
58 fn to_tokens(&self, tokens: &mut TokenStream2) {
59 let attrs = &self.module.attrs;
60 let vis = &self.module.vis;
61 let mod_token = &self.module.mod_token;
62 let ident = &self.module.ident;
63
64 let (_content_brace, content_items) =
65 &self.module.content.as_ref().expect("Can only support `mod {}` right now.");
66
67 let mut hasher = std::collections::hash_map::DefaultHasher::new();
69 content_items.hash(&mut hasher);
70 let postfix = hasher.finish();
71 let mut updated_content = content_items.clone();
74 let sql_graph_entity_fn_name = syn::Ident::new(
75 &format!("__pgx_internals_schema_{}_{}", ident, postfix),
76 Span::call_site(),
77 );
78 updated_content.push(syn::parse_quote! {
79 #[no_mangle]
80 #[doc(hidden)]
81 pub extern "Rust" fn #sql_graph_entity_fn_name() -> ::pgx::utils::sql_entity_graph::SqlGraphEntity {
82 extern crate alloc;
83 use alloc::vec::Vec;
84 use alloc::vec;
85 let submission = pgx::utils::sql_entity_graph::SchemaEntity {
86 module_path: module_path!(),
87 name: stringify!(#ident),
88 file: file!(),
89 line: line!(),
90 };
91 ::pgx::utils::sql_entity_graph::SqlGraphEntity::Schema(submission)
92 }
93 });
94 let _semi = &self.module.semi;
95
96 let inv = quote! {
97 #(#attrs)*
98 #vis #mod_token #ident {
99 #(#updated_content)*
100 }
101 };
102 tokens.append_all(inv);
103 }
104}