diff --git a/joinrs_proc/src/lib.rs b/joinrs_proc/src/lib.rs index 1d7f93e..1107058 100644 --- a/joinrs_proc/src/lib.rs +++ b/joinrs_proc/src/lib.rs @@ -102,18 +102,37 @@ fn generate_parse_object( fn generate_parse_vec(inner_type: Box) -> proc_macro2::TokenStream { 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! { { let mut parse_closure = || -> joinrs::anyhow::Result<_> { 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(value); + vec.push(current_row_value); + + if previous_comparison.is_some() && *previous_comparison.unwrap() != *current_row_comparison { + break + } + + rows.next(); + previous_comparison = Some(current_row_comparison.clone()); } Ok(vec) }; + parse_closure() } }