1use std::marker::PhantomData;
6
7#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash)]
9pub struct Unset;
10
11#[derive(Debug)]
13pub struct Set<Value>(PhantomData<fn() -> Value>);
14
15#[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 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
35pub trait Push<New> {
38 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);