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