Skip to main content

ruststream_sqlx/
settings.rs

1//! The machinery of a table's settings as types, shared by the inbox's and the outbox's typed
2//! builders: a setting is [`Unset`] or [`Set`], two declarations fold slot by slot through
3//! [`Merge`], and a typed setter appends its marker with [`Push`].
4
5use std::marker::PhantomData;
6
7/// A setting a table leaves at its default.
8#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
9pub struct Unset;
10
11/// A setting a table sets, with the marker that sets it.
12#[derive(Debug)]
13pub struct Set<Value>(PhantomData<fn() -> Value>);
14
15/// Folds one setting of two declarations into one; a setting set by both has no fold.
16#[diagnostic::on_unimplemented(
17    message = "a table sets this setting twice: `{Self}` and `{Other}`",
18    label = "set twice",
19    note = "a table sets each setting once: drop one of the two setter calls on its `InboxSpec` or \
20            `OutboxSpec`, and the marker from `type Table`"
21)]
22pub trait Merge<Other> {
23    /// The setting the two declare together.
24    type Out;
25}
26
27impl<Other> Merge<Other> for Unset {
28    type Out = Other;
29}
30
31impl<Value> Merge<Unset> for Set<Value> {
32    type Out = Self;
33}
34
35/// Appends a marker to a tuple of markers: what a typed setter of a table's spec does to its
36/// settings.
37pub trait Push<New> {
38    /// The tuple with `New` at its end.
39    type Out;
40}
41
42impl<New> Push<New> for () {
43    type Out = (New,);
44}
45
46macro_rules! push {
47    ($($each:ident),+) => {
48        impl<$($each,)+ New> Push<New> for ($($each,)+) {
49            type Out = ($($each,)+ New);
50        }
51    };
52}
53
54push!(Setting1);
55push!(Setting1, Setting2);
56push!(Setting1, Setting2, Setting3);
57push!(Setting1, Setting2, Setting3, Setting4);
58push!(Setting1, Setting2, Setting3, Setting4, Setting5);
59push!(Setting1, Setting2, Setting3, Setting4, Setting5, Setting6);
60push!(
61    Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7
62);
63push!(
64    Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8
65);
66push!(
67    Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9
68);
69push!(
70    Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
71    Setting10
72);
73push!(
74    Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
75    Setting10, Setting11
76);
77push!(
78    Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
79    Setting10, Setting11, Setting12
80);
81push!(
82    Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
83    Setting10, Setting11, Setting12, Setting13
84);
85push!(
86    Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
87    Setting10, Setting11, Setting12, Setting13, Setting14
88);
89push!(
90    Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
91    Setting10, Setting11, Setting12, Setting13, Setting14, Setting15
92);
93push!(
94    Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
95    Setting10, Setting11, Setting12, Setting13, Setting14, Setting15, Setting16
96);
97push!(
98    Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
99    Setting10, Setting11, Setting12, Setting13, Setting14, Setting15, Setting16, Setting17
100);
101push!(
102    Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
103    Setting10, Setting11, Setting12, Setting13, Setting14, Setting15, Setting16, Setting17,
104    Setting18
105);
106push!(
107    Setting1, Setting2, Setting3, Setting4, Setting5, Setting6, Setting7, Setting8, Setting9,
108    Setting10, Setting11, Setting12, Setting13, Setting14, Setting15, Setting16, Setting17,
109    Setting18, Setting19
110);