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    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}