chuchi_postgres_derive/
lib.rs1mod from_row;
2mod row;
3mod table_templ;
4mod to_row;
5
6use from_row::expand_from_row;
7use quote::quote;
8
9use row::expand_row;
10use syn::parse_macro_input;
11use syn::DeriveInput;
12
13use proc_macro::TokenStream as V1TokenStream;
14
15use proc_macro2::{Ident, Span};
16
17use proc_macro_crate::{crate_name, FoundCrate};
18use table_templ::expand_table_templ;
19use to_row::expand_to_row;
20
21use crate::row::RowInput;
22
23#[proc_macro_derive(TableTempl, attributes(len, index, unique))]
26pub fn derive_table_templ(input: V1TokenStream) -> V1TokenStream {
27 let input = parse_macro_input!(input as DeriveInput);
28
29 let name = crate_name("chuchi-postgres")
31 .expect("chuchi-postgres not in dependencies");
32 let name = match name {
33 FoundCrate::Itself => quote!(crate),
34 FoundCrate::Name(n) => {
35 let ident = Ident::new(&n, Span::call_site());
36 quote!(#ident)
37 }
38 };
39
40 expand_table_templ(&input, &name).unwrap_or_else(to_compile_error)
41}
42
43#[proc_macro_derive(FromRow)]
45pub fn derive_from_row(input: V1TokenStream) -> V1TokenStream {
46 let input = parse_macro_input!(input as DeriveInput);
47
48 let name = crate_name("chuchi-postgres")
50 .expect("chuchi-postgres not in dependencies");
51 let name = match name {
52 FoundCrate::Itself => quote!(crate),
53 FoundCrate::Name(n) => {
54 let ident = Ident::new(&n, Span::call_site());
55 quote!(#ident)
56 }
57 };
58
59 expand_from_row(&input, &name).unwrap_or_else(to_compile_error)
60}
61
62#[proc_macro_derive(ToRow)]
64pub fn derive_to_row(input: V1TokenStream) -> V1TokenStream {
65 let input = parse_macro_input!(input as DeriveInput);
66
67 let name = crate_name("chuchi-postgres")
69 .expect("chuchi-postgres not in dependencies");
70 let name = match name {
71 FoundCrate::Itself => quote!(crate),
72 FoundCrate::Name(n) => {
73 let ident = Ident::new(&n, Span::call_site());
74 quote!(#ident)
75 }
76 };
77
78 expand_to_row(&input, &name).unwrap_or_else(to_compile_error)
79}
80
81#[proc_macro]
82pub fn row(input: V1TokenStream) -> V1TokenStream {
83 let input = parse_macro_input!(input as RowInput);
84
85 let name = crate_name("chuchi-postgres")
87 .expect("chuchi-postgres not in dependencies");
88 let name = match name {
89 FoundCrate::Itself => quote!(crate),
90 FoundCrate::Name(n) => {
91 let ident = Ident::new(&n, Span::call_site());
92 quote!(#ident)
93 }
94 };
95
96 expand_row(&input, &name).unwrap_or_else(to_compile_error)
97}
98
99fn to_compile_error(error: syn::Error) -> V1TokenStream {
100 let compile_error = syn::Error::to_compile_error(&error);
101 quote!(#compile_error).into()
102}