Skip to main content

camel_dsl/
contract.rs

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}