#![recursion_limit = "512"]
extern crate proc_macro;
extern crate syn;
#[macro_use]
extern crate quote;
use proc_macro::TokenStream;
use syn::parse_macro_input;
mod fields_macro;
#[proc_macro]
pub fn fields(input: TokenStream) -> TokenStream {
let _ = env_logger::try_init();
tracing::debug!("Source code for `{}`:\n", &input);
let ast = parse_macro_input!(input as fields_macro::FieldsMacro);
let gen = match ast {
fields_macro::FieldsMacro::FieldList { struct_type, query } => {
fields_macro::parse(&query, struct_type)
}
fields_macro::FieldsMacro::Top => Ok(quote!(toql::toql_api::fields::Fields::from(vec![
"*".to_string()
]))),
};
match gen {
Ok(o) => {
tracing::debug!("{}", o.to_string());
TokenStream::from(o)
}
Err(e) => {
tracing::debug!("{}", e.to_string());
TokenStream::from(e)
}
}
}
#[test]
fn valid_fieldlist() {
use fields_macro::FieldsMacro;
let input = "User, \"prop1, prop2_*\" ";
let m = syn::parse_str(input);
assert_eq!(m.is_ok(), true);
let m = m.unwrap();
assert!(matches!(m, FieldsMacro::FieldList { .. }));
if let FieldsMacro::FieldList { query, struct_type } = m {
let f = fields_macro::parse(&query, struct_type);
assert_eq!(f.is_ok(), true);
}
}
#[test]
fn valid_top() {
use fields_macro::FieldsMacro;
let input = "top";
let m = syn::parse_str(input);
assert_eq!(m.is_ok(), true);
let m = m.unwrap();
assert!(matches!(m, FieldsMacro::Top));
}
#[test]
fn invalid_mixed_case_top() {
use fields_macro::FieldsMacro;
let input = "Top";
let m: syn::Result<FieldsMacro> = syn::parse_str(input);
assert_eq!(m.is_ok(), false);
}
#[test]
fn missing_fieldlist() {
use fields_macro::FieldsMacro;
let input = "User";
let m: syn::Result<FieldsMacro> = syn::parse_str(input);
assert_eq!(m.is_ok(), false);
}
#[test]
fn invalid_fieldlist() {
use fields_macro::FieldsMacro;
let input = "User, \"prop1 prop2\" ";
let m = syn::parse_str(input);
assert_eq!(m.is_ok(), true);
let m = m.unwrap();
assert!(matches!(m, FieldsMacro::FieldList { .. }));
if let FieldsMacro::FieldList { query, struct_type } = m {
let f = fields_macro::parse(&query, struct_type);
assert_eq!(f.is_err(), true);
}
}