1use crate::PtrConst;
2
3#[derive(Clone, Copy, Debug)]
5#[repr(C)]
6#[non_exhaustive]
7pub struct ScalarDef {
8 pub affinity: ScalarAffinity,
11}
12
13impl ScalarDef {
14 pub const fn builder() -> ScalarDefBuilder {
16 ScalarDefBuilder::new()
17 }
18}
19
20#[derive(Default)]
22pub struct ScalarDefBuilder {
23 affinity: Option<ScalarAffinity>,
24}
25
26impl ScalarDefBuilder {
27 #[allow(clippy::new_without_default)]
29 pub const fn new() -> Self {
30 Self { affinity: None }
31 }
32
33 pub const fn affinity(mut self, affinity: ScalarAffinity) -> Self {
35 self.affinity = Some(affinity);
36 self
37 }
38
39 pub const fn build(self) -> ScalarDef {
41 ScalarDef {
42 affinity: self.affinity.unwrap(),
43 }
44 }
45}
46
47#[derive(Clone, Copy, Debug)]
50#[repr(C)]
51#[non_exhaustive]
52pub enum ScalarAffinity {
53 Number(NumberAffinity),
55 ComplexNumber(ComplexNumberAffinity),
57 String(StringAffinity),
59 Boolean(BoolAffinity),
61 Empty(EmptyAffinity),
63 SocketAddr(SocketAddrAffinity),
65 IpAddr(IpAddrAffinity),
67 UUID(UuidAffinity),
69 ULID(UlidAffinity),
71 Time(TimeAffinity),
73 Opaque(OpaqueAffinity),
75 Other(OtherAffinity),
77 Char(CharAffinity),
79 Path(PathAffinity),
81}
82
83impl ScalarAffinity {
84 pub const fn number() -> NumberAffinityBuilder {
86 NumberAffinityBuilder::new()
87 }
88
89 pub const fn complex_number() -> ComplexNumberAffinityBuilder {
91 ComplexNumberAffinityBuilder::new()
92 }
93
94 pub const fn string() -> StringAffinityBuilder {
96 StringAffinityBuilder::new()
97 }
98
99 pub const fn boolean() -> BoolAffinityBuilder {
101 BoolAffinityBuilder::new()
102 }
103
104 pub const fn empty() -> EmptyAffinityBuilder {
106 EmptyAffinityBuilder::new()
107 }
108
109 pub const fn socket_addr() -> SocketAddrAffinityBuilder {
111 SocketAddrAffinityBuilder::new()
112 }
113
114 pub const fn ip_addr() -> IpAddrAffinityBuilder {
116 IpAddrAffinityBuilder::new()
117 }
118
119 pub const fn uuid() -> UuidAffinityBuilder {
121 UuidAffinityBuilder::new()
122 }
123
124 pub const fn ulid() -> UlidAffinityBuilder {
126 UlidAffinityBuilder::new()
127 }
128
129 pub const fn time() -> TimeAffinityBuilder {
131 TimeAffinityBuilder::new()
132 }
133
134 pub const fn opaque() -> OpaqueAffinityBuilder {
136 OpaqueAffinityBuilder::new()
137 }
138
139 pub const fn other() -> OtherAffinityBuilder {
141 OtherAffinityBuilder::new()
142 }
143
144 pub const fn char() -> CharAffinityBuilder {
146 CharAffinityBuilder::new()
147 }
148
149 pub const fn path() -> PathAffinityBuilder {
151 PathAffinityBuilder::new()
152 }
153}
154
155#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
161#[repr(C)]
162#[non_exhaustive]
163pub struct NumberAffinity {
164 pub bits: NumberBits,
166
167 pub min: PtrConst<'static>,
169
170 pub max: PtrConst<'static>,
172
173 pub positive_infinity: Option<PtrConst<'static>>,
175
176 pub negative_infinity: Option<PtrConst<'static>>,
178
179 pub nan_sample: Option<PtrConst<'static>>,
182
183 pub positive_zero: Option<PtrConst<'static>>,
185
186 pub negative_zero: Option<PtrConst<'static>>,
188
189 pub epsilon: Option<PtrConst<'static>>,
192}
193
194#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
196#[repr(C)]
197pub enum Signedness {
198 Signed,
200 Unsigned,
202}
203
204#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
206#[repr(C)]
207#[non_exhaustive]
208pub enum NumberBits {
209 Integer {
211 bits: usize,
213 sign: Signedness,
215 },
216 Float {
218 sign_bits: usize,
220 exponent_bits: usize,
222 mantissa_bits: usize,
224 has_explicit_first_mantissa_bit: bool,
229 },
230 Fixed {
232 sign_bits: usize,
234 integer_bits: usize,
236 fraction_bits: usize,
238 },
239 Decimal {
241 sign_bits: usize,
243 integer_bits: usize,
245 scale_bits: usize,
247 },
248}
249
250impl NumberAffinity {
251 pub const fn builder() -> NumberAffinityBuilder {
253 NumberAffinityBuilder::new()
254 }
255}
256
257#[repr(C)]
259pub struct NumberAffinityBuilder {
260 limits: Option<NumberBits>,
261 min: Option<PtrConst<'static>>,
262 max: Option<PtrConst<'static>>,
263 positive_infinity: Option<PtrConst<'static>>,
264 negative_infinity: Option<PtrConst<'static>>,
265 nan_sample: Option<PtrConst<'static>>,
266 positive_zero: Option<PtrConst<'static>>,
267 negative_zero: Option<PtrConst<'static>>,
268 epsilon: Option<PtrConst<'static>>,
269}
270
271impl NumberAffinityBuilder {
272 #[allow(clippy::new_without_default)]
274 pub const fn new() -> Self {
275 Self {
276 limits: None,
277 min: None,
278 max: None,
279 positive_infinity: None,
280 negative_infinity: None,
281 nan_sample: None,
282 positive_zero: None,
283 negative_zero: None,
284 epsilon: None,
285 }
286 }
287
288 pub const fn integer(mut self, bits: usize, sign: Signedness) -> Self {
290 self.limits = Some(NumberBits::Integer { bits, sign });
291 self
292 }
293
294 pub const fn signed_integer(self, bits: usize) -> Self {
296 self.integer(bits, Signedness::Signed)
297 }
298
299 pub const fn unsigned_integer(self, bits: usize) -> Self {
301 self.integer(bits, Signedness::Unsigned)
302 }
303
304 pub const fn float(
306 mut self,
307 sign_bits: usize,
308 exponent_bits: usize,
309 mantissa_bits: usize,
310 has_explicit_first_mantissa_bit: bool,
311 ) -> Self {
312 self.limits = Some(NumberBits::Float {
313 sign_bits,
314 exponent_bits,
315 mantissa_bits,
316 has_explicit_first_mantissa_bit,
317 });
318 self
319 }
320
321 pub const fn fixed(
323 mut self,
324 sign_bits: usize,
325 integer_bits: usize,
326 fraction_bits: usize,
327 ) -> Self {
328 self.limits = Some(NumberBits::Fixed {
329 sign_bits,
330 integer_bits,
331 fraction_bits,
332 });
333 self
334 }
335
336 pub const fn min(mut self, min: PtrConst<'static>) -> Self {
338 self.min = Some(min);
339 self
340 }
341
342 pub const fn max(mut self, max: PtrConst<'static>) -> Self {
344 self.max = Some(max);
345 self
346 }
347
348 pub const fn positive_infinity(mut self, value: PtrConst<'static>) -> Self {
350 self.positive_infinity = Some(value);
351 self
352 }
353
354 pub const fn negative_infinity(mut self, value: PtrConst<'static>) -> Self {
356 self.negative_infinity = Some(value);
357 self
358 }
359
360 pub const fn nan_sample(mut self, value: PtrConst<'static>) -> Self {
362 self.nan_sample = Some(value);
363 self
364 }
365
366 pub const fn positive_zero(mut self, value: PtrConst<'static>) -> Self {
368 self.positive_zero = Some(value);
369 self
370 }
371
372 pub const fn negative_zero(mut self, value: PtrConst<'static>) -> Self {
374 self.negative_zero = Some(value);
375 self
376 }
377
378 pub const fn epsilon(mut self, value: PtrConst<'static>) -> Self {
380 self.epsilon = Some(value);
381 self
382 }
383
384 pub const fn build(self) -> ScalarAffinity {
386 ScalarAffinity::Number(NumberAffinity {
387 bits: self.limits.unwrap(),
388 min: self.min.unwrap(),
389 max: self.max.unwrap(),
390 positive_infinity: self.positive_infinity,
391 negative_infinity: self.negative_infinity,
392 nan_sample: self.nan_sample,
393 positive_zero: self.positive_zero,
394 negative_zero: self.negative_zero,
395 epsilon: self.epsilon,
396 })
397 }
398}
399
400#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
402#[repr(C)]
403#[non_exhaustive]
404pub struct ComplexNumberAffinity {
405 inner: ComplexNumberAffinityInner,
407}
408
409#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
410#[repr(C)]
411#[non_exhaustive]
412enum ComplexNumberAffinityInner {
413 Cartesian {
415 component: NumberAffinity,
418 },
419 Polar {
421 absolute: NumberAffinity,
423 bearing: NumberAffinity,
425 },
426}
427
428impl ComplexNumberAffinity {
429 pub const fn builder() -> ComplexNumberAffinityBuilder {
431 ComplexNumberAffinityBuilder::new()
432 }
433}
434
435#[repr(C)]
437pub struct ComplexNumberAffinityBuilder {
438 inner: ComplexNumberAffinityBuilderInner,
439}
440
441#[repr(C)]
442enum ComplexNumberAffinityBuilderInner {
443 Undefined,
444 Cartesian {
445 component: NumberAffinity,
448 },
449 Polar {
450 absolute: NumberAffinity,
451 bearing: NumberAffinity,
452 },
453}
454
455impl ComplexNumberAffinityBuilder {
456 #[allow(clippy::new_without_default)]
458 pub const fn new() -> Self {
459 Self {
460 inner: ComplexNumberAffinityBuilderInner::Undefined,
461 }
462 }
463
464 pub const fn cartesian(self, component: NumberAffinity) -> Self {
466 Self {
467 inner: ComplexNumberAffinityBuilderInner::Cartesian { component },
468 }
469 }
470
471 pub const fn polar(self, absolute: NumberAffinity, bearing: NumberAffinity) -> Self {
473 Self {
474 inner: ComplexNumberAffinityBuilderInner::Polar { absolute, bearing },
475 }
476 }
477
478 pub const fn build(self) -> ScalarAffinity {
480 use ComplexNumberAffinityBuilderInner as Inner;
481 use ComplexNumberAffinityInner as AffInner;
482 let inner = match self.inner {
483 Inner::Undefined => panic!(),
484 Inner::Cartesian { component } => AffInner::Cartesian { component },
485 Inner::Polar { absolute, bearing } => AffInner::Polar { absolute, bearing },
486 };
487 ScalarAffinity::ComplexNumber(ComplexNumberAffinity { inner })
488 }
489}
490
491#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
493#[repr(C)]
494#[non_exhaustive]
495pub struct StringAffinity {
496 pub max_inline_length: Option<usize>,
498}
499
500impl StringAffinity {
501 pub const fn builder() -> StringAffinityBuilder {
503 StringAffinityBuilder::new()
504 }
505}
506
507#[repr(C)]
509pub struct StringAffinityBuilder {
510 max_inline_length: Option<usize>,
511}
512
513impl StringAffinityBuilder {
514 #[allow(clippy::new_without_default)]
516 pub const fn new() -> Self {
517 Self {
518 max_inline_length: None,
519 }
520 }
521
522 pub const fn max_inline_length(mut self, max_inline_length: usize) -> Self {
524 self.max_inline_length = Some(max_inline_length);
525 self
526 }
527
528 pub const fn build(self) -> ScalarAffinity {
530 ScalarAffinity::String(StringAffinity {
531 max_inline_length: self.max_inline_length,
532 })
533 }
534}
535
536#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
538#[repr(C)]
539#[non_exhaustive]
540pub struct BoolAffinity {}
541
542impl BoolAffinity {
543 pub const fn builder() -> BoolAffinityBuilder {
545 BoolAffinityBuilder::new()
546 }
547}
548
549#[repr(C)]
551pub struct BoolAffinityBuilder {}
552
553impl BoolAffinityBuilder {
554 #[allow(clippy::new_without_default)]
556 pub const fn new() -> Self {
557 Self {}
558 }
559
560 pub const fn build(self) -> ScalarAffinity {
562 ScalarAffinity::Boolean(BoolAffinity {})
563 }
564}
565
566#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
568#[repr(C)]
569#[non_exhaustive]
570pub struct EmptyAffinity {}
571
572impl EmptyAffinity {
573 pub const fn builder() -> EmptyAffinityBuilder {
575 EmptyAffinityBuilder::new()
576 }
577}
578
579#[repr(C)]
581pub struct EmptyAffinityBuilder {}
582
583impl EmptyAffinityBuilder {
584 #[allow(clippy::new_without_default)]
586 pub const fn new() -> Self {
587 Self {}
588 }
589
590 pub const fn build(self) -> ScalarAffinity {
592 ScalarAffinity::Empty(EmptyAffinity {})
593 }
594}
595
596#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
598#[repr(C)]
599#[non_exhaustive]
600pub struct SocketAddrAffinity {}
601
602impl SocketAddrAffinity {
603 pub const fn builder() -> SocketAddrAffinityBuilder {
605 SocketAddrAffinityBuilder::new()
606 }
607}
608
609#[repr(C)]
611pub struct SocketAddrAffinityBuilder {}
612
613impl SocketAddrAffinityBuilder {
614 #[allow(clippy::new_without_default)]
616 pub const fn new() -> Self {
617 Self {}
618 }
619
620 pub const fn build(self) -> ScalarAffinity {
622 ScalarAffinity::SocketAddr(SocketAddrAffinity {})
623 }
624}
625
626#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
628#[repr(C)]
629#[non_exhaustive]
630pub struct IpAddrAffinity {}
631
632impl IpAddrAffinity {
633 pub const fn builder() -> IpAddrAffinityBuilder {
635 IpAddrAffinityBuilder::new()
636 }
637}
638
639#[repr(C)]
641pub struct IpAddrAffinityBuilder {}
642
643impl IpAddrAffinityBuilder {
644 #[allow(clippy::new_without_default)]
646 pub const fn new() -> Self {
647 Self {}
648 }
649
650 pub const fn build(self) -> ScalarAffinity {
652 ScalarAffinity::IpAddr(IpAddrAffinity {})
653 }
654}
655
656#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
658#[repr(C)]
659#[non_exhaustive]
660pub struct UuidAffinity {}
661
662impl UuidAffinity {
663 pub const fn builder() -> UuidAffinityBuilder {
665 UuidAffinityBuilder::new()
666 }
667}
668
669#[repr(C)]
671pub struct UuidAffinityBuilder {}
672
673impl UuidAffinityBuilder {
674 #[allow(clippy::new_without_default)]
676 pub const fn new() -> Self {
677 Self {}
678 }
679
680 pub const fn build(self) -> ScalarAffinity {
682 ScalarAffinity::UUID(UuidAffinity {})
683 }
684}
685
686#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
688#[repr(C)]
689#[non_exhaustive]
690pub struct UlidAffinity {}
691
692impl UlidAffinity {
693 pub const fn builder() -> UlidAffinityBuilder {
695 UlidAffinityBuilder::new()
696 }
697}
698
699#[repr(C)]
701pub struct UlidAffinityBuilder {}
702
703impl UlidAffinityBuilder {
704 #[allow(clippy::new_without_default)]
706 pub const fn new() -> Self {
707 UlidAffinityBuilder {}
708 }
709
710 pub const fn build(self) -> ScalarAffinity {
712 ScalarAffinity::ULID(UlidAffinity {})
713 }
714}
715
716#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
718#[repr(C)]
719#[non_exhaustive]
720pub struct TimeAffinity {
721 epoch: Option<PtrConst<'static>>,
725
726 min: Option<PtrConst<'static>>,
728
729 max: Option<PtrConst<'static>>,
731
732 granularity: Option<PtrConst<'static>>,
737
738 interval_elements: Option<&'static [PtrConst<'static>]>,
752
753 timezone_granularity: Option<PtrConst<'static>>,
758}
759
760impl TimeAffinity {
761 pub const fn builder() -> TimeAffinityBuilder {
763 TimeAffinityBuilder::new()
764 }
765}
766
767#[repr(C)]
769pub struct TimeAffinityBuilder {
770 epoch: Option<PtrConst<'static>>,
771 min: Option<PtrConst<'static>>,
772 max: Option<PtrConst<'static>>,
773 granularity: Option<PtrConst<'static>>,
774 interval_elements: Option<&'static [PtrConst<'static>]>,
775 timezone_granularity: Option<PtrConst<'static>>,
776}
777
778impl TimeAffinityBuilder {
779 #[allow(clippy::new_without_default)]
781 pub const fn new() -> Self {
782 Self {
783 epoch: None,
784 min: None,
785 max: None,
786 granularity: None,
787 interval_elements: None,
788 timezone_granularity: None,
789 }
790 }
791
792 pub const fn epoch(mut self, epoch: PtrConst<'static>) -> Self {
794 self.epoch = Some(epoch);
795 self
796 }
797
798 pub const fn min(mut self, min: PtrConst<'static>) -> Self {
800 self.min = Some(min);
801 self
802 }
803
804 pub const fn max(mut self, max: PtrConst<'static>) -> Self {
806 self.max = Some(max);
807 self
808 }
809
810 pub const fn granularity(mut self, granularity: PtrConst<'static>) -> Self {
812 self.granularity = Some(granularity);
813 self
814 }
815
816 pub const fn interval_elements(
818 mut self,
819 interval_elements: &'static [PtrConst<'static>],
820 ) -> Self {
821 self.interval_elements = Some(interval_elements);
822 self
823 }
824
825 pub const fn timezone_granularity(mut self, timezone_granularity: PtrConst<'static>) -> Self {
827 self.timezone_granularity = Some(timezone_granularity);
828 self
829 }
830
831 pub const fn build(self) -> ScalarAffinity {
833 ScalarAffinity::Time(TimeAffinity {
834 epoch: self.epoch,
835 min: self.min,
836 max: self.max,
837 granularity: self.granularity,
838 interval_elements: self.interval_elements,
839 timezone_granularity: self.timezone_granularity,
840 })
841 }
842}
843
844#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
846#[repr(C)]
847#[non_exhaustive]
848pub struct OpaqueAffinity {}
849
850impl OpaqueAffinity {
851 pub const fn builder() -> OpaqueAffinityBuilder {
853 OpaqueAffinityBuilder::new()
854 }
855}
856
857#[repr(C)]
859pub struct OpaqueAffinityBuilder {}
860
861impl OpaqueAffinityBuilder {
862 #[allow(clippy::new_without_default)]
864 pub const fn new() -> Self {
865 Self {}
866 }
867
868 pub const fn build(self) -> ScalarAffinity {
870 ScalarAffinity::Opaque(OpaqueAffinity {})
871 }
872}
873
874#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
876#[repr(C)]
877#[non_exhaustive]
878pub struct OtherAffinity {}
879
880impl OtherAffinity {
881 pub const fn builder() -> OtherAffinityBuilder {
883 OtherAffinityBuilder::new()
884 }
885}
886
887#[repr(C)]
889pub struct OtherAffinityBuilder {}
890
891impl OtherAffinityBuilder {
892 #[allow(clippy::new_without_default)]
894 pub const fn new() -> Self {
895 Self {}
896 }
897
898 pub const fn build(self) -> ScalarAffinity {
900 ScalarAffinity::Other(OtherAffinity {})
901 }
902}
903
904#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
906#[repr(C)]
907#[non_exhaustive]
908pub struct CharAffinity {}
909
910impl CharAffinity {
911 pub const fn builder() -> CharAffinityBuilder {
913 CharAffinityBuilder::new()
914 }
915}
916
917#[repr(C)]
919pub struct CharAffinityBuilder {}
920
921impl CharAffinityBuilder {
922 #[allow(clippy::new_without_default)]
924 pub const fn new() -> Self {
925 Self {}
926 }
927
928 pub const fn build(self) -> ScalarAffinity {
930 ScalarAffinity::Char(CharAffinity {})
931 }
932}
933
934#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
936#[repr(C)]
937#[non_exhaustive]
938pub struct PathAffinity {}
939
940impl PathAffinity {
941 pub const fn builder() -> PathAffinityBuilder {
943 PathAffinityBuilder::new()
944 }
945}
946
947#[repr(C)]
949pub struct PathAffinityBuilder {}
950
951impl PathAffinityBuilder {
952 #[allow(clippy::new_without_default)]
954 pub const fn new() -> Self {
955 Self {}
956 }
957
958 pub const fn build(self) -> ScalarAffinity {
960 ScalarAffinity::Path(PathAffinity {})
961 }
962}