Skip to content

Commit d1ff180

Browse files
committed
Further simplification of descriptors
1 parent 89e92ec commit d1ff180

File tree

1 file changed

+65
-140
lines changed

1 file changed

+65
-140
lines changed

gel-db-protocol/src/descriptors.rs

Lines changed: 65 additions & 140 deletions
Original file line numberDiff line numberDiff line change
@@ -266,19 +266,21 @@ protocol!(
266266

267267
/// Generates the boilerplate for each descriptor type. There's a lot of repetition.
268268
macro_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 [...].
324347
impl_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
401419
impl<'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-
415425
impl<'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())]
426436
pub 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-
460453
impl<'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-
477462
impl<'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-
501478
impl<'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-
527496
impl<'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-
552513
impl<'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-
576529
impl<'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())]
587540
pub 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-
607552
impl<'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-
637565
impl<'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-
658578
impl<'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-
679591
impl<'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\tstd::uuid",
730+
b"\x01\0\0\0\0\03\n@\xcb\xfb\xa9R\x96\x11\xf0\x87\xb1\xe5\xf0\xe4\x14\x17=\0\0\0\x1d__derived__",
731+
b"::default|A@view~1\x01\0\0\03\n@\xccPvR\x96\x11\xf0\xb9\xe2\xf5\x99I\x91\xb2\xfd\0\0\0\x1d__derived__",
732+
b"::default|B@view~2\x01\0\0\0g\x0b@\xcc\x8b\xe8R\x96\x11\xf0\x9eN?\x7f\xed\xb8\x0cx\0\0\0J__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\xa8Z*1\0\0\x03\0\x01\0\0\0\x01A\0\0\0\x02id\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

Comments
 (0)