pub mod entity;
use proc_macro2::{Span, TokenStream as TokenStream2};
use quote::{quote, ToTokens, TokenStreamExt};
use syn::parse::{Parse, ParseStream};
use syn::{DeriveInput, Ident};
use crate::sql_entity_graph::ToSqlConfig;
#[derive(Debug, Clone)]
pub struct PostgresHash {
pub name: Ident,
pub to_sql_config: ToSqlConfig,
}
impl PostgresHash {
pub fn new(name: Ident, to_sql_config: ToSqlConfig) -> Result<Self, syn::Error> {
if !to_sql_config.overrides_default() {
crate::ident_is_acceptable_to_postgres(&name)?;
}
Ok(Self { name, to_sql_config })
}
pub fn from_derive_input(derive_input: DeriveInput) -> Result<Self, syn::Error> {
let to_sql_config =
ToSqlConfig::from_attributes(derive_input.attrs.as_slice())?.unwrap_or_default();
Self::new(derive_input.ident, to_sql_config)
}
}
impl Parse for PostgresHash {
fn parse(input: ParseStream) -> Result<Self, syn::Error> {
use syn::Item;
let parsed = input.parse()?;
let (ident, attrs) = match &parsed {
Item::Enum(item) => (item.ident.clone(), item.attrs.as_slice()),
Item::Struct(item) => (item.ident.clone(), item.attrs.as_slice()),
_ => return Err(syn::Error::new(input.span(), "expected enum or struct")),
};
let to_sql_config = ToSqlConfig::from_attributes(attrs)?.unwrap_or_default();
Self::new(ident, to_sql_config)
}
}
impl ToTokens for PostgresHash {
fn to_tokens(&self, tokens: &mut TokenStream2) {
let name = &self.name;
let sql_graph_entity_fn_name =
syn::Ident::new(&format!("__pgx_internals_hash_{}", self.name), Span::call_site());
let to_sql_config = &self.to_sql_config;
let inv = quote! {
#[no_mangle]
#[doc(hidden)]
pub extern "Rust" fn #sql_graph_entity_fn_name() -> ::pgx::utils::sql_entity_graph::SqlGraphEntity {
use core::any::TypeId;
extern crate alloc;
use alloc::vec::Vec;
use alloc::vec;
let submission = ::pgx::utils::sql_entity_graph::PostgresHashEntity {
name: stringify!(#name),
file: file!(),
line: line!(),
full_path: core::any::type_name::<#name>(),
module_path: module_path!(),
id: TypeId::of::<#name>(),
to_sql_config: #to_sql_config,
};
::pgx::utils::sql_entity_graph::SqlGraphEntity::Hash(submission)
}
};
tokens.append_all(inv);
}
}