extern crate serde_json;
extern crate serde_yaml;
mod expression;
mod tables;
mod structs;
mod token;
mod program;
mod json;
mod base;
use std::rc::Rc;
use proc_macro::{TokenStream};
use syn::__private::TokenStream2;
use core::iter::Iterator;
use proc_macro;
use std::{collections::BTreeMap, fs::File};
use std::fs;
use token::Tokens;
use program::parse;
use json::{tables_iter};
use std::collections::HashMap;
use expression::{Type, to_exp};
#[macro_use]
extern crate quote;
#[proc_macro]
pub fn tables(_input: TokenStream) -> TokenStream {
let gen = tables::tables(&tables_def());
TokenStream::from(gen)
}
#[proc_macro]
pub fn structs(_input: TokenStream) -> TokenStream {
let gen = structs::structs(&tables_def());
TokenStream::from(gen)
}
#[proc_macro]
pub fn path(_input: TokenStream) -> TokenStream {
let tables_def = tables_def();
let dir = path_config();
let gen: TokenStream2 = dir.iter().map(|(file_name, file_path)| {
let str = fs::read_to_string(&file_path).expect(&format!("文件找不到: {}", &file_path));
let stream: TokenStream = str.parse().expect(&format!("文件继续错误: {}", &file_path));
let mut tokens = Tokens::new(stream);
let mut funcs = Vec::new();
let ast = parse(&mut tokens, &mut funcs).expect(&format!("{}", &file_path));
let mut funcs_type = to_func_type(&funcs);
let (one_path, _, _) = to_exp(&ast, &mut funcs_type, None, &tables_def);
quote! {
#file_name => Ok({#one_path}),
}
})
.collect();
let gen = quote! {
unsafe {
match name {
#gen
_ => Err(format!("不认识的查询:{}", name))
}
}
};
TokenStream::from(gen)
}
#[proc_macro]
pub fn insert_data(_input: TokenStream) -> TokenStream {
let config = config();
let map = tables_iter(&config);
let gen = map.iter().map(|(table_name, _)| {
let name: syn::Ident = syn::parse_str(table_name).expect(&format!("表名不合法, {}", table_name));
quote! {
#table_name => {
let e: entity::#name = entity::#name::new_test(&json_data);
unsafe {
database::DATABASE.#name.add_data(e);
}
},
}
}).collect::<TokenStream2>();
let gen = quote! {
match table_name.as_str() {
#gen
_ => panic!("没有这个表,{:?}", table_name)
}
};
TokenStream::from(gen)
}
#[proc_macro]
pub fn insert_test(_input: TokenStream) -> TokenStream {
let config = config();
let map = tables_iter(&config);
let gen = map.iter().map(|(table_name, _)| {
let name: syn::Ident = syn::parse_str(table_name).expect(&format!("表名不合法, {}", table_name));
quote! {
#table_name => {
let e: entity::#name = entity::#name::new_test(&json_data);
unsafe {
database::DATABASE.#name.add_test(e, |x, key, entity_op| {
x();
});
}
},
}
}).collect::<TokenStream2>();
let gen = quote! {
match table_name.as_str() {
#gen
_ => panic!("没有这个表,{:?}", table_name)
}
};
TokenStream::from(gen)
}
fn config() -> serde_json::Value {
let f = File::open("tables.json").expect("文件tables.json不存在");
serde_json::from_reader(f).expect("文件tables.json格式错误")
}
fn tables_def() -> HashMap<String, json::Table> {
let config = config();
match json::tables_def(&config) {
Ok(v) => v,
Err(err) => panic!("tables.json文件有错误,{:?}", err)
}
}
fn path_config() -> BTreeMap<String, String> {
let f = File::open("path.yaml").expect("文件path.yaml不存在");
let result: BTreeMap<String, String> = serde_yaml::from_reader(f).expect("文件path.yaml格式错误");
result
}
fn to_func_type(del: &Vec<String>) -> HashMap<String, Rc<Type<'static>>> {
let mut result = HashMap::new();
for v in del {
result.insert(v.to_string(), Rc::new(Type::Unknown));
}
result
}