pgx_sql_entity_graph/metadata/
function_metadata.rs

1/*!
2
3Function level metadata for Rust to SQL translation
4
5> Like all of the [`sql_entity_graph`][crate::pgx_sql_entity_graph] APIs, this is considered **internal**
6to the `pgx` framework and very subject to change between versions. While you may use this, please do it with caution.
7
8
9*/
10use super::{FunctionMetadataEntity, PhantomDataExt, SqlTranslatable};
11use core::marker::PhantomData;
12
13/**
14Provide SQL generation related information on functions
15
16```rust
17use pgx_sql_entity_graph::metadata::{FunctionMetadata, Returns, SqlMapping};
18fn floof(i: i32) -> String { todo!() }
19
20type FunctionPointer = fn(i32) -> String;
21let marker: FunctionPointer = floof;
22let metadata = pgx_sql_entity_graph::metadata::FunctionMetadata::entity(&marker);
23assert_eq!(
24    metadata.retval.unwrap().return_sql,
25    Ok(Returns::One(SqlMapping::As("TEXT".to_string()))),
26);
27```
28 */
29pub trait FunctionMetadata<Inputs, Output> {
30    fn path(&self) -> &'static str {
31        core::any::type_name::<Self>()
32    }
33    fn entity(&self) -> FunctionMetadataEntity;
34}
35
36impl<Output> FunctionMetadata<(), Output> for fn() -> Output
37where
38    Output: SqlTranslatable,
39{
40    fn entity(&self) -> FunctionMetadataEntity {
41        FunctionMetadataEntity {
42            arguments: vec![],
43            retval: {
44                let marker: PhantomData<Output> = PhantomData;
45                Some(marker.entity())
46            },
47            path: self.path(),
48        }
49    }
50}
51
52impl<Output> FunctionMetadata<(), Output> for unsafe fn() -> Output
53where
54    Output: SqlTranslatable,
55{
56    fn entity(&self) -> FunctionMetadataEntity {
57        FunctionMetadataEntity {
58            arguments: vec![],
59            retval: {
60                let marker: PhantomData<Output> = PhantomData;
61                Some(marker.entity())
62            },
63            path: self.path(),
64        }
65    }
66}
67
68impl FunctionMetadata<(), ()> for fn() {
69    fn entity(&self) -> FunctionMetadataEntity {
70        FunctionMetadataEntity { arguments: vec![], retval: None, path: self.path() }
71    }
72}
73
74impl FunctionMetadata<(), ()> for unsafe fn() {
75    fn entity(&self) -> FunctionMetadataEntity {
76        FunctionMetadataEntity { arguments: vec![], retval: None, path: self.path() }
77    }
78}
79
80macro_rules! impl_fn {
81    ($($T:ident),* $(,)?) => {
82        impl<$($T: SqlTranslatable,)* Output: SqlTranslatable> FunctionMetadata<($($T,)*), Output> for fn($($T,)*) -> Output {
83            fn entity(&self) -> FunctionMetadataEntity {
84                FunctionMetadataEntity {
85                    arguments: vec![$(PhantomData::<$T>.entity()),+],
86                    retval: Some(PhantomData::<Output>.entity()),
87                    path: self.path(),
88                }
89            }
90        }
91        impl<$($T: SqlTranslatable,)* Output: SqlTranslatable> FunctionMetadata<($($T,)*), Output> for unsafe fn($($T,)*) -> Output {
92            fn entity(&self) -> FunctionMetadataEntity {
93                FunctionMetadataEntity {
94                    arguments: vec![$(PhantomData::<$T>.entity()),+],
95                    retval: Some(PhantomData::<Output>.entity()),
96                    path: self.path(),
97                }
98            }
99        }
100        impl<$($T: SqlTranslatable,)*> FunctionMetadata<($($T,)*), ()> for fn($($T,)*) {
101            fn entity(&self) -> FunctionMetadataEntity {
102                FunctionMetadataEntity {
103                    arguments: vec![$(PhantomData::<$T>.entity()),+],
104                    retval: None,
105                    path: self.path(),
106                }
107            }
108        }
109        impl<$($T: SqlTranslatable,)*> FunctionMetadata<($($T,)*), ()> for unsafe fn($($T,)*) {
110            fn entity(&self) -> FunctionMetadataEntity {
111                FunctionMetadataEntity {
112                    arguments: vec![$(PhantomData::<$T>.entity()),+],
113                    retval: None,
114                    path: self.path(),
115                }
116            }
117        }
118    };
119}
120// empty tuples are above
121impl_fn!(T0);
122impl_fn!(T0, T1);
123impl_fn!(T0, T1, T2);
124impl_fn!(T0, T1, T2, T3);
125impl_fn!(T0, T1, T2, T3, T4);
126impl_fn!(T0, T1, T2, T3, T4, T5);
127impl_fn!(T0, T1, T2, T3, T4, T5, T6);
128impl_fn!(T0, T1, T2, T3, T4, T5, T6, T7);
129impl_fn!(T0, T1, T2, T3, T4, T5, T6, T7, T8);
130impl_fn!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9);
131impl_fn!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10);
132impl_fn!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11);
133impl_fn!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12);
134impl_fn!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13);
135impl_fn!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14);
136impl_fn!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15);
137impl_fn!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16);
138impl_fn!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17);
139impl_fn!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18);
140impl_fn!(T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19);
141impl_fn!(
142    T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20
143);
144impl_fn!(
145    T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
146    T21
147);
148impl_fn!(
149    T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
150    T21, T22
151);
152impl_fn!(
153    T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
154    T21, T22, T23
155);
156impl_fn!(
157    T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
158    T21, T22, T23, T24
159);
160impl_fn!(
161    T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
162    T21, T22, T23, T24, T25
163);
164impl_fn!(
165    T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
166    T21, T22, T23, T24, T25, T26
167);
168impl_fn!(
169    T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
170    T21, T22, T23, T24, T25, T26, T27
171);
172impl_fn!(
173    T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
174    T21, T22, T23, T24, T25, T26, T27, T28
175);
176impl_fn!(
177    T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
178    T21, T22, T23, T24, T25, T26, T27, T28, T29
179);
180impl_fn!(
181    T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
182    T21, T22, T23, T24, T25, T26, T27, T28, T29, T30
183);
184impl_fn!(
185    T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20,
186    T21, T22, T23, T24, T25, T26, T27, T28, T29, T30, T31
187);