1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
2pub enum DeclarativeStepKind {
3 To,
4 Log,
5 SetHeader,
6 SetHeaderIfAbsent,
7 SetProperty,
8 SetBody,
9 Filter,
10 Function,
11 Choice,
12 Split,
13 Aggregate,
14 WireTap,
15 Multicast,
16 Stop,
17 Script,
18 ConvertBodyTo,
19 Marshal,
20 Unmarshal,
21 Bean,
22 DynamicRouter,
23 LoadBalance,
24 RoutingSlip,
25 Throttle,
26 RecipientList,
27 Process,
28 ProcessFn,
29 MapBody,
30 SetBodyFn,
31 SetHeaderFn,
32 StreamCache,
33 Validate,
34 Delay,
35 Loop,
36 Enrich,
37 PollEnrich,
38 DoTry,
39 IdempotentConsumer,
40 Cache,
41 CacheInvalidate,
42 CachePeekStale,
43 ClaimCheck,
44 Sampling,
45 Sort,
46 Resequence,
47}
48
49pub const MANDATORY_DECLARATIVE_STEP_KINDS: [DeclarativeStepKind; 38] = [
50 DeclarativeStepKind::To,
51 DeclarativeStepKind::Log,
52 DeclarativeStepKind::SetHeader,
53 DeclarativeStepKind::SetProperty,
54 DeclarativeStepKind::SetBody,
55 DeclarativeStepKind::Filter,
56 DeclarativeStepKind::Function,
57 DeclarativeStepKind::Choice,
58 DeclarativeStepKind::Split,
59 DeclarativeStepKind::Aggregate,
60 DeclarativeStepKind::WireTap,
61 DeclarativeStepKind::Multicast,
62 DeclarativeStepKind::Stop,
63 DeclarativeStepKind::Script,
64 DeclarativeStepKind::StreamCache,
65 DeclarativeStepKind::Validate,
66 DeclarativeStepKind::ConvertBodyTo,
67 DeclarativeStepKind::Marshal,
68 DeclarativeStepKind::Unmarshal,
69 DeclarativeStepKind::Bean,
70 DeclarativeStepKind::DynamicRouter,
71 DeclarativeStepKind::LoadBalance,
72 DeclarativeStepKind::RoutingSlip,
73 DeclarativeStepKind::Throttle,
74 DeclarativeStepKind::RecipientList,
75 DeclarativeStepKind::Delay,
76 DeclarativeStepKind::Loop,
77 DeclarativeStepKind::Enrich,
78 DeclarativeStepKind::PollEnrich,
79 DeclarativeStepKind::DoTry,
80 DeclarativeStepKind::IdempotentConsumer,
81 DeclarativeStepKind::Cache,
82 DeclarativeStepKind::CacheInvalidate,
83 DeclarativeStepKind::CachePeekStale,
84 DeclarativeStepKind::ClaimCheck,
85 DeclarativeStepKind::Sampling,
86 DeclarativeStepKind::Sort,
87 DeclarativeStepKind::Resequence,
88];
89
90pub fn is_rust_only_kind(kind: DeclarativeStepKind) -> bool {
91 matches!(
92 kind,
93 DeclarativeStepKind::Process
94 | DeclarativeStepKind::ProcessFn
95 | DeclarativeStepKind::MapBody
96 | DeclarativeStepKind::SetBodyFn
97 | DeclarativeStepKind::SetHeaderFn
98 | DeclarativeStepKind::SetHeaderIfAbsent
99 )
100}
101
102pub fn mandatory_declarative_step_kinds() -> &'static [DeclarativeStepKind] {
103 &MANDATORY_DECLARATIVE_STEP_KINDS
104}
105
106pub const fn assert_contract_coverage(implemented: &[DeclarativeStepKind]) {
107 let mut i = 0;
108 while i < MANDATORY_DECLARATIVE_STEP_KINDS.len() {
109 let required = MANDATORY_DECLARATIVE_STEP_KINDS[i];
110 let mut found = false;
111
112 let mut j = 0;
113 while j < implemented.len() {
114 if implemented[j] as u8 == required as u8 {
115 found = true;
116 break;
117 }
118 j += 1;
119 }
120
121 if !found {
122 panic!("DSL is missing mandatory declarative step");
123 }
124 i += 1;
125 }
126}
127
128#[cfg(test)]
129mod tests {
130 use super::*;
131
132 #[test]
133 fn is_rust_only_kind_true() {
134 assert!(is_rust_only_kind(DeclarativeStepKind::Process));
135 assert!(is_rust_only_kind(DeclarativeStepKind::ProcessFn));
136 assert!(is_rust_only_kind(DeclarativeStepKind::MapBody));
137 assert!(is_rust_only_kind(DeclarativeStepKind::SetBodyFn));
138 assert!(is_rust_only_kind(DeclarativeStepKind::SetHeaderFn));
139 assert!(is_rust_only_kind(DeclarativeStepKind::SetHeaderIfAbsent));
140 }
141
142 #[test]
143 fn is_rust_only_kind_false() {
144 assert!(!is_rust_only_kind(DeclarativeStepKind::To));
145 assert!(!is_rust_only_kind(DeclarativeStepKind::Log));
146 assert!(!is_rust_only_kind(DeclarativeStepKind::Filter));
147 assert!(!is_rust_only_kind(DeclarativeStepKind::Choice));
148 assert!(!is_rust_only_kind(DeclarativeStepKind::Multicast));
149 }
150
151 #[test]
152 fn mandatory_kinds_has_38_entries() {
153 assert_eq!(MANDATORY_DECLARATIVE_STEP_KINDS.len(), 38);
154 assert_eq!(mandatory_declarative_step_kinds().len(), 38);
155 }
156
157 #[test]
158 fn assert_contract_coverage_passes_with_all() {
159 assert_contract_coverage(&MANDATORY_DECLARATIVE_STEP_KINDS);
160 }
161
162 #[test]
163 #[should_panic(expected = "DSL is missing mandatory declarative step")]
164 fn assert_contract_coverage_panics_on_missing() {
165 assert_contract_coverage(&[DeclarativeStepKind::To, DeclarativeStepKind::Log]);
166 }
167
168 #[test]
169 fn kind_equality() {
170 assert_eq!(DeclarativeStepKind::To, DeclarativeStepKind::To);
171 assert_ne!(DeclarativeStepKind::To, DeclarativeStepKind::Log);
172 }
173}