naphtha_proc_macro/
lib.rs

1//! This crate is a support crate that contains the necessary macros for naphtha to compile.
2
3extern 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    // QUERY BY PROPERTY TRAIT
34    #[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    // SQLITE
41    #[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    // MYSQL
52    #[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    // PostgreSQL
63    #[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}