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