chuchi_postgres_derive/
lib.rs

1mod 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// inspired from https://github.com/serde-rs/serde/blob/master/serde_derive
24
25#[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	// crate name
30	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// attributes(len, index, unique)
44#[proc_macro_derive(FromRow)]
45pub fn derive_from_row(input: V1TokenStream) -> V1TokenStream {
46	let input = parse_macro_input!(input as DeriveInput);
47
48	// crate name
49	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// attributes(len, index, unique)
63#[proc_macro_derive(ToRow)]
64pub fn derive_to_row(input: V1TokenStream) -> V1TokenStream {
65	let input = parse_macro_input!(input as DeriveInput);
66
67	// crate name
68	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	// crate name
86	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}