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#[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}