cdbc_macro/
lib.rs

1#![allow(unused_assignments)]
2extern crate proc_macro;
3
4mod scan;
5mod crud;
6use std::fs::File;
7use std::io::Read;
8use quote::quote;
9use crate::proc_macro::TokenStream;
10
11/// this Scan will find on Cargo.toml database driver to impl cdbc::impl_scan!(#db_type,#name{#fields});
12#[proc_macro_derive(Scan)]
13pub fn macro_derive_scan_all(input: TokenStream) -> TokenStream {
14    let mut cargo_data = "".to_string();
15    let mut f = File::open("Cargo.lock").unwrap();
16    f.read_to_string(&mut cargo_data).unwrap();
17    drop(f);
18
19    let mut database = vec![];
20    for line in cargo_data.lines() {
21        if line.trim_start_matches(r#"name = ""#).starts_with("cdbc-mysql") {
22            database.push(quote!(cdbc_mysql::MySqlRow));
23        }
24        if line.trim_start_matches(r#"name = ""#).starts_with("cdbc-pg") {
25            database.push(quote!(cdbc_pg::PgRow));
26        }
27        if line.trim_start_matches(r#"name = ""#).starts_with("cdbc-sqlite") {
28            database.push(quote!(cdbc_sqlite::SqliteRow));
29        }
30        if line.trim_start_matches(r#"name = ""#).starts_with("cdbc-mssql") {
31            database.push(quote!(cdbc_mssql::MssqlRow));
32        }
33    }
34
35    let ast = syn::parse(input).unwrap();
36    let stream = scan::impl_scan(&ast, &database);
37    #[cfg(feature = "debug_mode")]
38    {
39        println!("............gen impl Scan:\n {}", stream);
40        println!("............gen impl Scan end............");
41    }
42    stream
43}
44
45#[proc_macro_derive(ScanSqlite)]
46pub fn macro_derive_scan_sqlite(input: TokenStream) -> TokenStream {
47    let ast = syn::parse(input).unwrap();
48    let stream = scan::impl_scan(&ast, &[quote!(cdbc_sqlite::SqliteRow)]);
49    #[cfg(feature = "debug_mode")]
50    {
51        println!("............gen impl Scan:\n {}", stream);
52        println!("............gen impl Scan end............");
53    }
54    stream
55}
56
57#[proc_macro_derive(ScanMssql)]
58pub fn macro_derive_scan_mssql(input: TokenStream) -> TokenStream {
59    let ast = syn::parse(input).unwrap();
60    let stream = scan::impl_scan(&ast, &[quote!(cdbc_mssql::MssqlRow)]);
61    #[cfg(feature = "debug_mode")]
62    {
63        println!("............gen impl Scan:\n {}", stream);
64        println!("............gen impl Scan end............");
65    }
66    stream
67}
68
69#[proc_macro_derive(ScanMysql)]
70pub fn macro_derive_scan_mysql(input: TokenStream) -> TokenStream {
71    let ast = syn::parse(input).unwrap();
72    let stream = scan::impl_scan(&ast, &[quote!(cdbc_mysql::MySqlRow)]);
73    #[cfg(feature = "debug_mode")]
74    {
75        println!("............gen impl Scan:\n {}", stream);
76        println!("............gen impl Scan end............");
77    }
78    stream
79}
80
81#[proc_macro_derive(ScanPg)]
82pub fn macro_derive_scan_pg(input: TokenStream) -> TokenStream {
83    let ast = syn::parse(input).unwrap();
84    let stream = scan::impl_scan(&ast, &[quote!(cdbc_pg::PgRow)]);
85    #[cfg(feature = "debug_mode")]
86    {
87        println!("............gen impl Scan:\n {}", stream);
88        println!("............gen impl Scan end............");
89    }
90    stream
91}
92
93
94#[proc_macro_attribute]
95pub fn crud(args: TokenStream, input: TokenStream) -> TokenStream {
96    let mut cargo_data = "".to_string();
97    let mut f = File::open("Cargo.lock").unwrap();
98    f.read_to_string(&mut cargo_data).unwrap();
99    drop(f);
100    let mut database = vec![];
101    for line in cargo_data.lines() {
102        if line.trim_start_matches(r#"name = ""#).starts_with("cdbc-mysql") {
103            database.push(vec![quote!(cdbc::Pool<cdbc_mysql::MySql>),
104                               quote!(cdbc_mysql::MySqlConnection),
105                               quote!(cdbc::Transaction::<'_,cdbc_mysql::MySql>),
106                               quote!(cdbc::PoolConnection::<cdbc_mysql::MySql>)]);
107        }
108        if line.trim_start_matches(r#"name = ""#).starts_with("cdbc-pg") {
109            database.push(vec![quote!(cdbc::Pool<cdbc_pg::Postgres>),
110                               quote!(cdbc_pg::PgConnection),
111                               quote!(cdbc::Transaction::<'_,cdbc_pg::Postgres>),
112                               quote!(cdbc::PoolConnection::<cdbc_pg::Postgres>)]);
113        }
114        if line.trim_start_matches(r#"name = ""#).starts_with("cdbc-sqlite") {
115            database.push(vec![quote!(cdbc::Pool<cdbc_sqlite::Sqlite>),
116                               quote!(cdbc_sqlite::SqliteConnection),
117                               quote!(cdbc::Transaction::<'_,cdbc_sqlite::Sqlite>),
118                               quote!(cdbc::PoolConnection::<cdbc_sqlite::Sqlite>)]);
119        }
120        if line.trim_start_matches(r#"name = ""#).starts_with("cdbc-mssql") {
121            database.push(vec![quote!(cdbc::Pool<cdbc_mssql::Mssql>),
122                               quote!(cdbc_mssql::MssqlConnection),
123                               quote!(cdbc::Transaction::<'_,cdbc_mssql::Mssql>),
124                               quote!(cdbc::PoolConnection::<cdbc_mssql::Mssql>)]);
125        }
126    }
127    let stream = crud::impl_crud(input, database);
128    #[cfg(feature = "debug_mode")]
129    {
130        println!("............gen crud:\n {}", stream);
131        println!("............gen crud end............");
132    }
133    stream
134}