pgx_utils/sql_entity_graph/postgres_ord/
mod.rs1pub mod entity;
18
19use proc_macro2::{Span, TokenStream as TokenStream2};
20use quote::{quote, ToTokens, TokenStreamExt};
21use syn::parse::{Parse, ParseStream};
22use syn::{DeriveInput, Ident};
23
24use crate::sql_entity_graph::ToSqlConfig;
25
26#[derive(Debug, Clone)]
70pub struct PostgresOrd {
71 pub name: Ident,
72 pub to_sql_config: ToSqlConfig,
73}
74
75impl PostgresOrd {
76 pub fn new(name: Ident, to_sql_config: ToSqlConfig) -> Result<Self, syn::Error> {
77 if !to_sql_config.overrides_default() {
78 crate::ident_is_acceptable_to_postgres(&name)?;
79 }
80
81 Ok(Self { name, to_sql_config })
82 }
83
84 pub fn from_derive_input(derive_input: DeriveInput) -> Result<Self, syn::Error> {
85 let to_sql_config =
86 ToSqlConfig::from_attributes(derive_input.attrs.as_slice())?.unwrap_or_default();
87 Self::new(derive_input.ident, to_sql_config)
88 }
89}
90
91impl Parse for PostgresOrd {
92 fn parse(input: ParseStream) -> Result<Self, syn::Error> {
93 use syn::Item;
94
95 let parsed = input.parse()?;
96 let (ident, attrs) = match &parsed {
97 Item::Enum(item) => (item.ident.clone(), item.attrs.as_slice()),
98 Item::Struct(item) => (item.ident.clone(), item.attrs.as_slice()),
99 _ => return Err(syn::Error::new(input.span(), "expected enum or struct")),
100 };
101 let to_sql_config = ToSqlConfig::from_attributes(attrs)?.unwrap_or_default();
102 Self::new(ident, to_sql_config)
103 }
104}
105
106impl ToTokens for PostgresOrd {
107 fn to_tokens(&self, tokens: &mut TokenStream2) {
108 let name = &self.name;
109 let sql_graph_entity_fn_name =
110 syn::Ident::new(&format!("__pgx_internals_ord_{}", self.name), Span::call_site());
111 let to_sql_config = &self.to_sql_config;
112 let inv = quote! {
113 #[no_mangle]
114 #[doc(hidden)]
115 pub extern "Rust" fn #sql_graph_entity_fn_name() -> ::pgx::utils::sql_entity_graph::SqlGraphEntity {
116 use core::any::TypeId;
117 extern crate alloc;
118 use alloc::vec::Vec;
119 use alloc::vec;
120 let submission = ::pgx::utils::sql_entity_graph::PostgresOrdEntity {
121 name: stringify!(#name),
122 file: file!(),
123 line: line!(),
124 full_path: core::any::type_name::<#name>(),
125 module_path: module_path!(),
126 id: TypeId::of::<#name>(),
127 to_sql_config: #to_sql_config,
128 };
129 ::pgx::utils::sql_entity_graph::SqlGraphEntity::Ord(submission)
130 }
131 };
132 tokens.append_all(inv);
133 }
134}