1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
use proc_macro2::TokenStream;
use std::fs::File;
use std::io::{Read, Write};
use std::path::Path;

mod ast;
mod generator;
mod parser;
mod queries;

pub fn parse_schema(core_schema_path: &Path, derived_relations_path: &Path) -> ast::DatabaseSchema {
    let mut core_schema_file = File::open(core_schema_path).unwrap();
    let mut core_schema_content = String::new();
    core_schema_file
        .read_to_string(&mut core_schema_content)
        .unwrap();
    let mut schema: ast::DatabaseSchema = match syn::parse_str(&core_schema_content) {
        Ok(config) => config,
        Err(err) => panic!("Error: {:?} (at {:?})", err, err.span().start()),
    };
    let mut derived_relations_file = File::open(derived_relations_path).unwrap();
    let mut derived_relations_content = String::new();
    derived_relations_file
        .read_to_string(&mut derived_relations_content)
        .unwrap();
    let derived_relations: ast::Relations = match syn::parse_str(&derived_relations_content) {
        Ok(relations) => relations,
        Err(err) => panic!("Error: {:?} (at {:?}", err, err.span().start()),
    };
    schema.derived_relations = derived_relations.into();
    schema
}

pub fn generate_definition(dest_path: &Path, schema: ast::DatabaseSchema) {
    let tokens = generator::generate_tokens(schema);
    let mut file = File::create(dest_path).unwrap();
    file.write(tokens.to_string().as_bytes()).unwrap();
}

pub fn generate_query(schema: ast::DatabaseSchema, input: TokenStream) -> TokenStream {
    queries::generate(schema, input)
}