naphtha_proc_macro/
lib.rs1extern crate proc_macro;
4extern crate quote;
5
6use {
7 quote::quote,
8 syn::{parse, DeriveInput},
9};
10
11#[cfg(any(
12 feature = "barrel-sqlite",
13 feature = "barrel-mysql",
14 feature = "barrel-pg"
15))]
16mod barrel_impl;
17mod database_impl;
18mod database_traits;
19#[allow(dead_code)]
20mod helper;
21
22#[proc_macro_attribute]
23pub fn model(
24 attr: ::proc_macro::TokenStream,
25 item: ::proc_macro::TokenStream,
26) -> ::proc_macro::TokenStream {
27 let ast: DeriveInput = parse(item).expect(
28 "proc_macro_attribute model: Could not parse TokenStream input!",
29 );
30 let attr = format!("#[{}]", attr);
31 let attr: ::proc_macro2::TokenStream = attr.parse().unwrap();
32
33 #[cfg(not(any(feature = "sqlite", feature = "mysql", feature = "pg")))]
35 let impl_trait_query_by_properties = quote! {};
36 #[cfg(any(feature = "sqlite", feature = "mysql", feature = "pg"))]
37 let impl_trait_query_by_properties =
38 database_traits::impl_trait_query_by_properties(&ast);
39
40 #[cfg(not(feature = "sqlite"))]
42 let impl_sqlite = quote! {};
43 #[cfg(feature = "sqlite")]
44 let impl_sqlite = database_impl::sqlite::impl_sqlite(&ast, &attr);
45
46 #[cfg(not(feature = "barrel-sqlite"))]
47 let impl_barrel_sqlite = quote! {};
48 #[cfg(feature = "barrel-sqlite")]
49 let impl_barrel_sqlite = barrel_impl::sqlite::impl_sqlite(&ast);
50
51 #[cfg(not(feature = "mysql"))]
53 let impl_mysql = quote! {};
54 #[cfg(feature = "mysql")]
55 let impl_mysql = database_impl::mysql::impl_mysql(&ast, &attr);
56
57 #[cfg(not(feature = "barrel-mysql"))]
58 let impl_barrel_mysql = quote! {};
59 #[cfg(feature = "barrel-mysql")]
60 let impl_barrel_mysql = barrel_impl::mysql::impl_mysql(&ast);
61
62 #[cfg(not(feature = "pg"))]
64 let impl_pg = quote! {};
65 #[cfg(feature = "pg")]
66 let impl_pg = database_impl::pg::impl_pg(&ast, &attr);
67 #[cfg(not(feature = "barrel-pg"))]
68 let impl_barrel_pg = quote! {};
69 #[cfg(feature = "barrel-pg")]
70 let impl_barrel_pg = barrel_impl::pg::impl_pg(&ast);
71
72 let output = quote! {
73 use self::schema::*;
74 #[cfg(any(feature = "sqlite", feature = "mysql", feature = "pg"))]
75 use {
76 ::naphtha::diesel::{backend::Backend, prelude::*},
77 };
78
79 #[derive(
80 Debug,
81 Queryable,
82 Identifiable,
83 AsChangeset,
84 Associations
85 )]
86 #attr
87 #ast
88
89 #impl_trait_query_by_properties
90
91 #impl_sqlite
92 #impl_barrel_sqlite
93
94 #impl_mysql
95 #impl_barrel_mysql
96
97 #impl_pg
98 #impl_barrel_pg
99 };
100
101 ::proc_macro::TokenStream::from(output)
102}