|
|
@ -102,18 +102,37 @@ fn generate_parse_object(
|
|
|
|
fn generate_parse_vec(inner_type: Box<TypeMapping>) -> proc_macro2::TokenStream {
|
|
|
|
fn generate_parse_vec(inner_type: Box<TypeMapping>) -> proc_macro2::TokenStream {
|
|
|
|
let value_expression = generate_parse_expression(&*inner_type);
|
|
|
|
let value_expression = generate_parse_expression(&*inner_type);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let extract_comparitor = match *inner_type {
|
|
|
|
|
|
|
|
TypeMapping::Vec(_) => panic!("Ambiguous data structure: Cannot parse vec of vec"),
|
|
|
|
|
|
|
|
TypeMapping::Column(_) => quote! { ¤t_row_value },
|
|
|
|
|
|
|
|
// TODO: Parse ID column from the return type declaration
|
|
|
|
|
|
|
|
TypeMapping::Object { struct_name: _, properties: _ } => quote! { ¤t_row_value.uuid },
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
quote! {
|
|
|
|
quote! {
|
|
|
|
{
|
|
|
|
{
|
|
|
|
let mut parse_closure = || -> joinrs::anyhow::Result<_> {
|
|
|
|
let mut parse_closure = || -> joinrs::anyhow::Result<_> {
|
|
|
|
let mut vec = Vec::new();
|
|
|
|
let mut vec = Vec::new();
|
|
|
|
let parse_result = #value_expression;
|
|
|
|
let mut previous_comparison = None;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
while let Some(_next) = rows.peek() {
|
|
|
|
|
|
|
|
let current_row_value = #value_expression?;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
let current_row_comparison = #extract_comparitor;
|
|
|
|
|
|
|
|
|
|
|
|
if let Ok(value) = parse_result {
|
|
|
|
vec.push(current_row_value);
|
|
|
|
vec.push(value);
|
|
|
|
|
|
|
|
|
|
|
|
if previous_comparison.is_some() && *previous_comparison.unwrap() != *current_row_comparison {
|
|
|
|
|
|
|
|
break
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rows.next();
|
|
|
|
|
|
|
|
previous_comparison = Some(current_row_comparison.clone());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Ok(vec)
|
|
|
|
Ok(vec)
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
parse_closure()
|
|
|
|
parse_closure()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|