@@ -20,6 +20,7 @@ pub(crate) struct FieldAttributes {
2020 flatten : bool ,
2121 pub ( crate ) rename : Option < String > ,
2222 skip : bool ,
23+ reference : Option < String > ,
2324}
2425
2526// This function will parse #[typesense(...)] on a FIELD
@@ -209,6 +210,16 @@ pub(crate) fn extract_field_attrs(field: &Field) -> syn::Result<FieldAttributes>
209210 }
210211 res. vec_dist = Some ( string_literal ( & mut tt_iter) ?) ;
211212 }
213+ "reference" => {
214+ skip_eq ( & i, & mut tt_iter) ?;
215+ if res. reference . is_some ( ) {
216+ return Err ( syn:: Error :: new_spanned (
217+ & i,
218+ "Attribute `reference` is duplicated" ,
219+ ) ) ;
220+ }
221+ res. reference = Some ( string_literal ( & mut tt_iter) ?) ;
222+ }
212223 "type" => {
213224 skip_eq ( & i, & mut tt_iter) ?;
214225 if res. type_override . is_some ( ) {
@@ -283,12 +294,16 @@ fn build_regular_field(field: &Field, field_attrs: &FieldAttributes) -> proc_mac
283294 let range_index = field_attrs. range_index . map ( |v| quote ! ( . range_index( #v) ) ) ;
284295 let locale = field_attrs. locale . as_ref ( ) . map ( |v| quote ! ( . locale( #v) ) ) ;
285296 let vec_dist = field_attrs. vec_dist . as_ref ( ) . map ( |v| quote ! ( . vec_dist( #v) ) ) ;
297+ let reference = field_attrs
298+ . reference
299+ . as_ref ( )
300+ . map ( |v| quote ! ( . reference( #v) ) ) ;
286301 let num_dim = field_attrs. num_dim . map ( |v| quote ! ( . num_dim( #v) ) ) ;
287302
288303 quote ! {
289304 vec![
290305 typesense:: models:: Field :: builder( ) . name( #field_name) . r#type( #typesense_field_type)
291- #optional #facet #index #store #sort #infix #stem #range_index #locale #vec_dist #num_dim
306+ #optional #facet #index #store #sort #infix #stem #range_index #locale #vec_dist #reference # num_dim
292307 . build( )
293308 ]
294309 }
0 commit comments