@@ -266,19 +266,21 @@ protocol!(
266266
267267/// Generates the boilerplate for each descriptor type. There's a lot of repetition.
268268macro_rules! impl_descriptor {
269- ( $( $type: ident) ,* $( , ) ?) => {
270- gel_protogen:: paste!( impl_descriptor!( __inner__ $(
271- ( $type,
269+ ( $self : ident , $ ( $type: ident [ $ ( $debug_name : ident = $debug_value : expr ) , * $ ( , ) ? ] ) ,* $( , ) ?) => {
270+ gel_protogen:: paste!( impl_descriptor!( __inner__ $self $ ( (
271+ $type,
272272 [ < $type Descriptor >] ,
273- [ < Parsed $type Descriptor >] )
274- ) * ) ; ) ;
273+ [ < Parsed $type Descriptor >] ,
274+ [ $( $debug_name = ( $debug_value ) ) ,* ]
275+ ) ) * ) ; ) ;
275276 } ;
276277
277- ( __inner__ $(
278- ( $name: ident,
278+ ( __inner__ $self : ident $ ( (
279+ $name: ident,
279280 $descriptor: ident,
280- $parsed_descriptor: ident)
281- ) * ) => {
281+ $parsed_descriptor: ident,
282+ [ $( $debug_name: ident = ( $( $debug_value: tt) * ) ) ,* ]
283+ ) ) * ) => {
282284 #[ derive( Debug , Clone , Copy , PartialEq , Eq , Protocol ) ]
283285 pub enum Descriptor <' a> {
284286 $(
@@ -298,6 +300,7 @@ macro_rules! impl_descriptor {
298300 }
299301 }
300302
303+ /// An enumeration of all possible parsed descriptors.
301304 #[ derive( derive_more:: Debug , Clone , Copy , derive_more:: From ) ]
302305 pub enum ParsedDescriptor <' a, ' b> {
303306 $(
@@ -318,24 +321,46 @@ macro_rules! impl_descriptor {
318321 }
319322 }
320323 }
324+
325+ // Generate the parsed descriptor structs
326+ $(
327+ #[ derive( Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
328+ pub struct $parsed_descriptor<' a, ' b> {
329+ #[ allow( unused) ]
330+ descriptors: & ' b ParsedDescriptors <' a>,
331+ #[ deref]
332+ descriptor: $descriptor<' a>,
333+ }
334+
335+ impl <' a, ' b> std:: fmt:: Debug for $parsed_descriptor<' a, ' b> {
336+ fn fmt( & $self, f: & mut std:: fmt:: Formatter <' _>) -> std:: fmt:: Result {
337+ f. debug_struct( stringify!( $parsed_descriptor) )
338+ . field( "id" , & $self. id( ) )
339+ $( . field( stringify!( $debug_name) , { & $( $debug_value) * } ) ) *
340+ . finish( )
341+ }
342+ }
343+ ) *
321344 } ;
322345}
323-
346+ // Descriptor implementations with debug strings in [...].
324347impl_descriptor ! (
325- Set ,
326- ObjectShape ,
327- BaseScalarType ,
328- ScalarType ,
329- TupleType ,
330- NamedTupleType ,
331- ArrayType ,
332- EnumerationType ,
333- InputShape ,
334- RangeType ,
335- ObjectType ,
336- CompoundType ,
337- MultiRangeType ,
338- SQLRecord ,
348+ self , // required for hygiene
349+
350+ Set [ ] ,
351+ ObjectShape [ ephemeral_free_shape=self . ephemeral_free_shape( ) , elements=self . elements( ) . collect:: <Vec <_>>( ) ] ,
352+ BaseScalarType [ ] ,
353+ ScalarType [ name=self . name( ) , schema_defined=self . schema_defined( ) , ancestors=self . ancestors( ) . collect:: <Vec <_>>( ) ] ,
354+ TupleType [ name=self . name( ) , schema_defined=self . schema_defined( ) , elements=self . elements( ) . collect:: <Vec <_>>( ) , ancestors=self . ancestors( ) . collect:: <Vec <_>>( ) ] ,
355+ NamedTupleType [ name=self . name( ) , schema_defined=self . schema_defined( ) , elements=self . elements( ) . collect:: <Vec <_>>( ) , ancestors=self . ancestors( ) . collect:: <Vec <_>>( ) ] ,
356+ ArrayType [ name=self . name( ) , schema_defined=self . schema_defined( ) , element_type=self . element_type( ) , dimensions=self . dimensions( ) , ancestors=self . ancestors( ) . collect:: <Vec <_>>( ) ] ,
357+ EnumerationType [ name=self . name( ) , schema_defined=self . schema_defined( ) , members=self . members( ) . collect:: <Vec <_>>( ) , ancestors=self . ancestors( ) . collect:: <Vec <_>>( ) ] ,
358+ InputShape [ elements=self . elements( ) . collect:: <Vec <_>>( ) ] ,
359+ RangeType [ name=self . name( ) , schema_defined=self . schema_defined( ) , element_type=self . element_type( ) , ancestors=self . ancestors( ) . collect:: <Vec <_>>( ) ] ,
360+ ObjectType [ name=self . name( ) , schema_defined=self . schema_defined( ) ] ,
361+ CompoundType [ name=self . name( ) , schema_defined=self . schema_defined( ) , op=self . op( ) , components=self . components( ) . collect:: <Vec <_>>( ) ] ,
362+ MultiRangeType [ name=self . name( ) , schema_defined=self . schema_defined( ) , range_type=self . range_type( ) , ancestors=self . ancestors( ) . collect:: <Vec <_>>( ) ] ,
363+ SQLRecord [ elements=self . elements( ) . collect:: <Vec <_>>( ) ] ,
339364) ;
340365
341366#[ derive( Debug , Default , Clone , Copy , PartialEq , Eq , PartialOrd , Ord , Hash , Protocol ) ]
@@ -390,28 +415,13 @@ impl<'a> ParsedDescriptors<'a> {
390415 }
391416}
392417
393- #[ derive( derive_more:: Debug , Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
394- #[ debug( "Set(id={})" , self . id( ) ) ]
395- pub struct ParsedSetDescriptor < ' a , ' b > {
396- descriptors : & ' b ParsedDescriptors < ' a > ,
397- #[ deref]
398- descriptor : SetDescriptor < ' a > ,
399- }
400-
418+ // Implementation blocks for the parsed descriptors
401419impl < ' a , ' b > ParsedSetDescriptor < ' a , ' b > {
402420 pub fn set_type ( & self ) -> ParsedDescriptor < ' a , ' b > {
403421 self . descriptors . get_descriptor ( self . descriptor . type_pos )
404422 }
405423}
406424
407- #[ derive( derive_more:: Debug , Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
408- #[ debug( "ObjectShape(id={}, ephemeral_free_shape={}, elements={:#?})" , self . id( ) , self . ephemeral_free_shape( ) , self . elements( ) . collect:: <Vec <_>>( ) ) ]
409- pub struct ParsedObjectShapeDescriptor < ' a , ' b > {
410- descriptors : & ' b ParsedDescriptors < ' a > ,
411- #[ deref]
412- descriptor : ObjectShapeDescriptor < ' a > ,
413- }
414-
415425impl < ' a , ' b > ParsedObjectShapeDescriptor < ' a , ' b > {
416426 pub fn elements ( & self ) -> impl Iterator < Item = ParsedObjectShapeElement < ' a , ' b > > {
417427 self . descriptor
@@ -422,7 +432,7 @@ impl<'a, 'b> ParsedObjectShapeDescriptor<'a, 'b> {
422432}
423433
424434#[ derive( derive_more:: Debug , Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
425- #[ debug( "ObjectShapeElement(name={:?}, cardinality={:?}, element_type={:?}, source_type={:?})" , self . name( ) , self . cardinality( ) , self . element_type( ) , self . source_type( ) ) ]
435+ #[ debug( "ObjectShapeElement(name={:?}, cardinality={:?}, element_type={:# ?}, source_type={:# ?})" , self . name( ) , self . cardinality( ) , self . element_type( ) , self . source_type( ) ) ]
426436pub struct ParsedObjectShapeElement < ' a , ' b > {
427437 descriptors : & ' b ParsedDescriptors < ' a > ,
428438 #[ deref]
@@ -440,23 +450,6 @@ impl<'a, 'b> ParsedObjectShapeElement<'a, 'b> {
440450 }
441451}
442452
443- #[ derive( derive_more:: Debug , Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
444- #[ debug( "Set(id={})" , self . id( ) ) ]
445- pub struct ParsedBaseScalarTypeDescriptor < ' a , ' b > {
446- #[ expect( unused) ]
447- descriptors : & ' b ParsedDescriptors < ' a > ,
448- #[ deref]
449- descriptor : BaseScalarTypeDescriptor < ' a > ,
450- }
451-
452- #[ derive( derive_more:: Debug , Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
453- #[ debug( "ScalarType(id={}, name={:?}, schema_defined={})" , self . id( ) , self . name( ) , self . schema_defined( ) ) ]
454- pub struct ParsedScalarTypeDescriptor < ' a , ' b > {
455- descriptors : & ' b ParsedDescriptors < ' a > ,
456- #[ deref]
457- descriptor : ScalarTypeDescriptor < ' a > ,
458- }
459-
460453impl < ' a , ' b > ParsedScalarTypeDescriptor < ' a , ' b > {
461454 pub fn ancestors ( & self ) -> impl Iterator < Item = ParsedDescriptor < ' a , ' b > > {
462455 self . descriptor
@@ -466,14 +459,6 @@ impl<'a, 'b> ParsedScalarTypeDescriptor<'a, 'b> {
466459 }
467460}
468461
469- #[ derive( derive_more:: Debug , Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
470- #[ debug( "TupleType(id={}, name={:?}, schema_defined={}, elements={:#?})" , self . id( ) , self . name( ) , self . schema_defined( ) , self . elements( ) . collect:: <Vec <_>>( ) ) ]
471- pub struct ParsedTupleTypeDescriptor < ' a , ' b > {
472- descriptors : & ' b ParsedDescriptors < ' a > ,
473- #[ deref]
474- descriptor : TupleTypeDescriptor < ' a > ,
475- }
476-
477462impl < ' a , ' b > ParsedTupleTypeDescriptor < ' a , ' b > {
478463 pub fn ancestors ( & self ) -> impl Iterator < Item = ParsedDescriptor < ' a , ' b > > {
479464 self . descriptor
@@ -490,14 +475,6 @@ impl<'a, 'b> ParsedTupleTypeDescriptor<'a, 'b> {
490475 }
491476}
492477
493- #[ derive( derive_more:: Debug , Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
494- #[ debug( "NamedTupleType(id={}, name={:?}, schema_defined={}, elements={:#?})" , self . id( ) , self . name( ) , self . schema_defined( ) , self . elements( ) . collect:: <Vec <_>>( ) ) ]
495- pub struct ParsedNamedTupleTypeDescriptor < ' a , ' b > {
496- descriptors : & ' b ParsedDescriptors < ' a > ,
497- #[ deref]
498- descriptor : NamedTupleTypeDescriptor < ' a > ,
499- }
500-
501478impl < ' a , ' b > ParsedNamedTupleTypeDescriptor < ' a , ' b > {
502479 pub fn ancestors ( & self ) -> impl Iterator < Item = ParsedDescriptor < ' a , ' b > > {
503480 self . descriptor
@@ -516,14 +493,6 @@ impl<'a, 'b> ParsedNamedTupleTypeDescriptor<'a, 'b> {
516493 }
517494}
518495
519- #[ derive( derive_more:: Debug , Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
520- #[ debug( "ArrayType(id={}, name={:?}, schema_defined={}, element_type={:?}, dimensions={:?})" , self . id( ) , self . name( ) , self . schema_defined( ) , self . element_type( ) , self . dimensions( ) ) ]
521- pub struct ParsedArrayTypeDescriptor < ' a , ' b > {
522- descriptors : & ' b ParsedDescriptors < ' a > ,
523- #[ deref]
524- descriptor : ArrayTypeDescriptor < ' a > ,
525- }
526-
527496impl < ' a , ' b > ParsedArrayTypeDescriptor < ' a , ' b > {
528497 pub fn element_type ( & self ) -> ParsedDescriptor < ' a , ' b > {
529498 self . descriptors . get_descriptor ( self . descriptor . type_pos )
@@ -541,14 +510,6 @@ impl<'a, 'b> ParsedArrayTypeDescriptor<'a, 'b> {
541510 }
542511}
543512
544- #[ derive( derive_more:: Debug , Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
545- #[ debug( "EnumerationType(id={}, name={:?}, schema_defined={}, members={:#?})" , self . id( ) , self . name( ) , self . schema_defined( ) , self . members( ) . collect:: <Vec <_>>( ) ) ]
546- pub struct ParsedEnumerationTypeDescriptor < ' a , ' b > {
547- descriptors : & ' b ParsedDescriptors < ' a > ,
548- #[ deref]
549- descriptor : EnumerationTypeDescriptor < ' a > ,
550- }
551-
552513impl < ' a , ' b > ParsedEnumerationTypeDescriptor < ' a , ' b > {
553514 pub fn members ( & self ) -> impl Iterator < Item = & ' a str > {
554515 self . descriptor
@@ -565,14 +526,6 @@ impl<'a, 'b> ParsedEnumerationTypeDescriptor<'a, 'b> {
565526 }
566527}
567528
568- #[ derive( derive_more:: Debug , Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
569- #[ debug( "InputShape(id={}, elements={:#?})" , self . id( ) , self . elements( ) . collect:: <Vec <_>>( ) ) ]
570- pub struct ParsedInputShapeDescriptor < ' a , ' b > {
571- descriptors : & ' b ParsedDescriptors < ' a > ,
572- #[ deref]
573- descriptor : InputShapeDescriptor < ' a > ,
574- }
575-
576529impl < ' a , ' b > ParsedInputShapeDescriptor < ' a , ' b > {
577530 pub fn elements ( & self ) -> impl Iterator < Item = ParsedInputShapeElement < ' a , ' b > > {
578531 self . descriptor
@@ -583,7 +536,7 @@ impl<'a, 'b> ParsedInputShapeDescriptor<'a, 'b> {
583536}
584537
585538#[ derive( derive_more:: Debug , Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
586- #[ debug( "InputShapeElement(name={:?}, cardinality={:?}, element_type={:?})" , self . name( ) , self . cardinality( ) , self . element_type( ) ) ]
539+ #[ debug( "InputShapeElement(name={:?}, cardinality={:?}, element_type={:# ?})" , self . name( ) , self . cardinality( ) , self . element_type( ) ) ]
587540pub struct ParsedInputShapeElement < ' a , ' b > {
588541 descriptors : & ' b ParsedDescriptors < ' a > ,
589542 #[ deref]
@@ -596,14 +549,6 @@ impl<'a, 'b> ParsedInputShapeElement<'a, 'b> {
596549 }
597550}
598551
599- #[ derive( derive_more:: Debug , Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
600- #[ debug( "RangeType(id={}, name={:?}, schema_defined={}, element_type={:?})" , self . id( ) , self . name( ) , self . schema_defined( ) , self . element_type( ) ) ]
601- pub struct ParsedRangeTypeDescriptor < ' a , ' b > {
602- descriptors : & ' b ParsedDescriptors < ' a > ,
603- #[ deref]
604- descriptor : RangeTypeDescriptor < ' a > ,
605- }
606-
607552impl < ' a , ' b > ParsedRangeTypeDescriptor < ' a , ' b > {
608553 pub fn element_type ( & self ) -> ParsedDescriptor < ' a , ' b > {
609554 self . descriptors . get_descriptor ( self . descriptor . type_pos )
@@ -617,23 +562,6 @@ impl<'a, 'b> ParsedRangeTypeDescriptor<'a, 'b> {
617562 }
618563}
619564
620- #[ derive( derive_more:: Debug , Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
621- #[ debug( "ObjectType(id={}, name={:?}, schema_defined={})" , self . id( ) , self . name( ) , self . schema_defined( ) ) ]
622- pub struct ParsedObjectTypeDescriptor < ' a , ' b > {
623- #[ expect( unused) ]
624- descriptors : & ' b ParsedDescriptors < ' a > ,
625- #[ deref]
626- descriptor : ObjectTypeDescriptor < ' a > ,
627- }
628-
629- #[ derive( derive_more:: Debug , Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
630- #[ debug( "CompoundType(id={}, name={:?}, schema_defined={}, elements={:#?})" , self . id( ) , self . name( ) , self . schema_defined( ) , self . components( ) . collect:: <Vec <_>>( ) ) ]
631- pub struct ParsedCompoundTypeDescriptor < ' a , ' b > {
632- descriptors : & ' b ParsedDescriptors < ' a > ,
633- #[ deref]
634- descriptor : CompoundTypeDescriptor < ' a > ,
635- }
636-
637565impl < ' a , ' b > ParsedCompoundTypeDescriptor < ' a , ' b > {
638566 pub fn op ( & self ) -> TypeOperation {
639567 self . descriptor . op
@@ -647,14 +575,6 @@ impl<'a, 'b> ParsedCompoundTypeDescriptor<'a, 'b> {
647575 }
648576}
649577
650- #[ derive( derive_more:: Debug , Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
651- #[ debug( "MultiRangeType(id={}, name={:?}, schema_defined={}, range_type={:?})" , self . id( ) , self . name( ) , self . schema_defined( ) , self . range_type( ) ) ]
652- pub struct ParsedMultiRangeTypeDescriptor < ' a , ' b > {
653- descriptors : & ' b ParsedDescriptors < ' a > ,
654- #[ deref]
655- descriptor : MultiRangeTypeDescriptor < ' a > ,
656- }
657-
658578impl < ' a , ' b > ParsedMultiRangeTypeDescriptor < ' a , ' b > {
659579 pub fn range_type ( & self ) -> ParsedDescriptor < ' a , ' b > {
660580 self . descriptors . get_descriptor ( self . descriptor . type_pos )
@@ -668,14 +588,6 @@ impl<'a, 'b> ParsedMultiRangeTypeDescriptor<'a, 'b> {
668588 }
669589}
670590
671- #[ derive( derive_more:: Debug , Clone , Copy , derive_more:: Deref , derive_more:: Constructor ) ]
672- #[ debug( "SQLRecord(id={}, elements={:#?})" , self . id( ) , self . elements( ) . collect:: <Vec <_>>( ) ) ]
673- pub struct ParsedSQLRecordDescriptor < ' a , ' b > {
674- descriptors : & ' b ParsedDescriptors < ' a > ,
675- #[ deref]
676- descriptor : SQLRecordDescriptor < ' a > ,
677- }
678-
679591impl < ' a , ' b > ParsedSQLRecordDescriptor < ' a , ' b > {
680592 pub fn elements ( & self ) -> impl Iterator < Item = ( & ' a str , ParsedDescriptor < ' a , ' b > ) > {
681593 self . descriptor . elements . into_iter ( ) . map ( |index| {
@@ -811,4 +723,17 @@ mod tests {
811723 let desc = parse_descriptor ( root, & buf) . unwrap ( ) ;
812724 eprintln ! ( "desc: {:#?}" , desc) ;
813725 }
726+
727+ #[ test]
728+ fn test_union ( ) {
729+ let buf = concat_bytes ( & [ b"\0 \0 \0 !\x03 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \x01 \0 \0 \0 \0 \t std::uuid" ,
730+ b"\x01 \0 \0 \0 \0 \0 3\n @\xcb \xfb \xa9 R\x96 \x11 \xf0 \x87 \xb1 \xe5 \xf0 \xe4 \x14 \x17 =\0 \0 \0 \x1d __derived__" ,
731+ b"::default|A@view~1\x01 \0 \0 \0 3\n @\xcc PvR\x96 \x11 \xf0 \xb9 \xe2 \xf5 \x99 I\x91 \xb2 \xfd \0 \0 \0 \x1d __derived__" ,
732+ b"::default|B@view~2\x01 \0 \0 \0 g\x0b @\xcc \x8b \xe8 R\x96 \x11 \xf0 \x9e N?\x7f \xed \xb8 \x0c x\0 \0 \0 J__derived__" ,
733+ b"::(__derived__:default|A@view~1 | __derived__:default|B@view~2)\0 \x01 \0 \x02 \0 \x01 \0 \x02 \0 \0 \0 %\x01 _" ,
734+ b"\xba \x14 >\xe0 \xc2 _$\xb7 \x85 \xa9 \xd3 \xa8 Z*1\0 \0 \x03 \0 \x01 \0 \0 \0 \x01 A\0 \0 \0 \x02 id\0 \0 \0 \x03 " ] ) ;
735+ let root = Uuid :: parse_str ( "5fba143e-e0c2-5f24-b785-a9d3a85a2a31" ) . unwrap ( ) ;
736+ let desc = parse_descriptor ( root, & buf) . unwrap ( ) ;
737+ eprintln ! ( "desc: {:#?}" , desc) ;
738+ }
814739}
0 commit comments