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