@@ -1042,7 +1042,6 @@ fn quote_trait_impls_for_archetype(obj: &Object) -> TokenStream {
1042
1042
assert_eq ! ( kind, & ObjectKind :: Archetype ) ;
1043
1043
1044
1044
let display_name = re_case:: to_human_case ( name) ;
1045
- let archetype_name = & obj. fqname ;
1046
1045
let name = format_ident ! ( "{name}" ) ;
1047
1046
1048
1047
fn compute_component_descriptors (
@@ -1056,18 +1055,11 @@ fn quote_trait_impls_for_archetype(obj: &Object) -> TokenStream {
1056
1055
field
1057
1056
. try_get_attr :: < String > ( requirement_attr_value)
1058
1057
. map ( |_| {
1059
- let Some ( component_name) = field. typ . fqname ( ) else {
1060
- panic ! ( "Archetype field must be an object/union or an array/vector of such" )
1061
- } ;
1062
-
1063
- let archetype_name = & obj. fqname ;
1058
+ let archetype_name = format_ident ! ( "{}" , obj. name) ;
1064
1059
let archetype_field_name = field. snake_case_name ( ) ;
1060
+ let fn_name = format_ident ! ( "descriptor_{archetype_field_name}" ) ;
1065
1061
1066
- quote ! ( ComponentDescriptor {
1067
- archetype_name: Some ( #archetype_name. into( ) ) ,
1068
- component_name: #component_name. into( ) ,
1069
- archetype_field_name: Some ( #archetype_field_name. into( ) ) ,
1070
- } )
1062
+ quote ! ( #archetype_name:: #fn_name( ) )
1071
1063
} )
1072
1064
} )
1073
1065
. collect_vec ( ) ;
@@ -1106,15 +1098,35 @@ fn quote_trait_impls_for_archetype(obj: &Object) -> TokenStream {
1106
1098
}
1107
1099
}
1108
1100
} )
1101
+ . chain ( std:: iter:: once ( {
1102
+ let archetype_name = & obj. fqname ;
1103
+ let indicator_component_name = format ! (
1104
+ "{}Indicator" ,
1105
+ obj. fqname. replace( "archetypes" , "components" )
1106
+ ) ;
1107
+
1108
+ let doc = "Returns the [`ComponentDescriptor`] for the associated indicator component." ;
1109
+
1110
+ quote ! {
1111
+ #[ doc = #doc]
1112
+ #[ inline]
1113
+ pub fn descriptor_indicator( ) -> ComponentDescriptor {
1114
+ ComponentDescriptor {
1115
+ archetype_name: Some ( #archetype_name. into( ) ) ,
1116
+ component_name: #indicator_component_name. into( ) ,
1117
+ archetype_field_name: None ,
1118
+ }
1119
+ }
1120
+ }
1121
+ } ) )
1109
1122
. collect_vec ( ) ;
1110
1123
1124
+ let archetype_name = format_ident ! ( "{}" , obj. name) ;
1111
1125
let indicator_name = format ! ( "{}Indicator" , obj. name) ;
1112
1126
1113
1127
let quoted_indicator_name = format_ident ! ( "{indicator_name}" ) ;
1114
1128
let quoted_indicator_doc =
1115
1129
format ! ( "Indicator component for the [`{name}`] [`::re_types_core::Archetype`]" ) ;
1116
- let indicator_component_name =
1117
- format ! ( "{}Indicator" , fqname. replace( "archetypes" , "components" ) ) ;
1118
1130
1119
1131
let ( num_required_descriptors, required_descriptors) =
1120
1132
compute_component_descriptors ( obj, ATTR_RERUN_COMPONENT_REQUIRED ) ;
@@ -1126,11 +1138,7 @@ fn quote_trait_impls_for_archetype(obj: &Object) -> TokenStream {
1126
1138
num_recommended_descriptors += 1 ;
1127
1139
recommended_descriptors = quote ! {
1128
1140
#recommended_descriptors
1129
- ComponentDescriptor {
1130
- archetype_name: Some ( #archetype_name. into( ) ) ,
1131
- component_name: #indicator_component_name. into( ) ,
1132
- archetype_field_name: None ,
1133
- } ,
1141
+ #archetype_name:: descriptor_indicator( ) ,
1134
1142
} ;
1135
1143
1136
1144
let num_components_docstring = quote_doc_line ( & format ! (
@@ -1190,21 +1198,14 @@ fn quote_trait_impls_for_archetype(obj: &Object) -> TokenStream {
1190
1198
quote ! { Some ( & self . #field_name as & dyn ComponentBatch ) }
1191
1199
} ;
1192
1200
1193
- let Some ( component_name) = obj_field. typ . fqname ( ) else {
1194
- panic ! ( "Archetype field must be an object/union or an array/vector of such" )
1195
- } ;
1196
- let archetype_name = & obj. fqname ;
1197
1201
let archetype_field_name = obj_field. snake_case_name ( ) ;
1202
+ let descr_fn_name = format_ident ! ( "descriptor_{archetype_field_name}" ) ;
1198
1203
1199
1204
quote ! {
1200
1205
( #batch) . map( |batch| {
1201
1206
:: re_types_core:: ComponentBatchCowWithDescriptor {
1202
1207
batch: batch. into( ) ,
1203
- descriptor_override: Some ( ComponentDescriptor {
1204
- archetype_name: Some ( #archetype_name. into( ) ) ,
1205
- archetype_field_name: Some ( ( #archetype_field_name) . into( ) ) ,
1206
- component_name: ( #component_name) . into( ) ,
1207
- } ) ,
1208
+ descriptor_override: Some ( Self :: #descr_fn_name( ) ) ,
1208
1209
}
1209
1210
} )
1210
1211
0 commit comments