1use super::{FunctionMetadataEntity, PhantomDataExt, SqlTranslatable};
11use core::marker::PhantomData;
12
13pub 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}
120impl_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);