sz_rust_sdk/
flags.rs

1//! Flag definitions for Senzing SDK operations
2//!
3//! This module defines the bitflags used to control the behavior of various
4//! Senzing SDK operations, matching the C# SDK's SzFlag enumeration exactly.
5//!
6//! For comprehensive flag documentation and usage examples, see:
7//! <https://www.senzing.com/docs/flags/4/>
8
9use bitflags::bitflags;
10
11bitflags! {
12    /// Bitflags for controlling Senzing SDK operations
13    ///
14    /// These flags match the C# SDK SzFlag enum exactly.
15    /// For detailed flag descriptions and usage patterns, see the official documentation:
16    /// <https://www.senzing.com/docs/flags/4/>
17    #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
18    #[repr(transparent)]
19    pub struct SzFlags: u64 {
20        // =================================================================
21        // Export flags (bits 0-5)
22        // =================================================================
23        const EXPORT_INCLUDE_MULTI_RECORD_ENTITIES = 1 << 0;
24        const EXPORT_INCLUDE_POSSIBLY_SAME = 1 << 1;
25        const EXPORT_INCLUDE_POSSIBLY_RELATED = 1 << 2;
26        const EXPORT_INCLUDE_NAME_ONLY = 1 << 3;
27        const EXPORT_INCLUDE_DISCLOSED = 1 << 4;
28        const EXPORT_INCLUDE_SINGLE_RECORD_ENTITIES = 1 << 5;
29
30        // =================================================================
31        // Entity relation flags (bits 6-9)
32        // =================================================================
33        const ENTITY_INCLUDE_POSSIBLY_SAME_RELATIONS = 1 << 6;
34        const ENTITY_INCLUDE_POSSIBLY_RELATED_RELATIONS = 1 << 7;
35        const ENTITY_INCLUDE_NAME_ONLY_RELATIONS = 1 << 8;
36        const ENTITY_INCLUDE_DISCLOSED_RELATIONS = 1 << 9;
37
38        // =================================================================
39        // Entity feature flags (bits 10-11)
40        // =================================================================
41        const ENTITY_INCLUDE_ALL_FEATURES = 1 << 10;
42        const ENTITY_INCLUDE_REPRESENTATIVE_FEATURES = 1 << 11;
43
44        // =================================================================
45        // Entity name and record flags (bits 12-16, 18)
46        // =================================================================
47        const ENTITY_INCLUDE_ENTITY_NAME = 1 << 12;
48        const ENTITY_INCLUDE_RECORD_SUMMARY = 1 << 13;
49        const ENTITY_INCLUDE_RECORD_DATA = 1 << 14;
50        const ENTITY_INCLUDE_RECORD_MATCHING_INFO = 1 << 15;
51        const ENTITY_INCLUDE_RECORD_JSON_DATA = 1 << 16;
52        // Note: bit 17 is unused
53        const ENTITY_INCLUDE_RECORD_FEATURES = 1 << 18;
54
55        // =================================================================
56        // Related entity flags (bits 19-22)
57        // =================================================================
58        const ENTITY_INCLUDE_RELATED_ENTITY_NAME = 1 << 19;
59        const ENTITY_INCLUDE_RELATED_MATCHING_INFO = 1 << 20;
60        const ENTITY_INCLUDE_RELATED_RECORD_SUMMARY = 1 << 21;
61        const ENTITY_INCLUDE_RELATED_RECORD_DATA = 1 << 22;
62
63        // =================================================================
64        // Internal/feature flags (bits 23-24)
65        // =================================================================
66        const ENTITY_INCLUDE_INTERNAL_FEATURES = 1 << 23;
67        const ENTITY_INCLUDE_FEATURE_STATS = 1 << 24;
68
69        // =================================================================
70        // Find path flags (bits 25, 30)
71        // =================================================================
72        const FIND_PATH_STRICT_AVOID = 1 << 25;
73        const FIND_PATH_INCLUDE_MATCHING_INFO = 1 << 30;
74
75        // =================================================================
76        // Scoring and stats flags (bits 26-27)
77        // =================================================================
78        const INCLUDE_FEATURE_SCORES = 1 << 26;
79        const SEARCH_INCLUDE_STATS = 1 << 27;
80
81        // =================================================================
82        // Record type flags (bits 28-29)
83        // =================================================================
84        const ENTITY_INCLUDE_RECORD_TYPES = 1 << 28;
85        const ENTITY_INCLUDE_RELATED_RECORD_TYPES = 1 << 29;
86
87        // =================================================================
88        // Additional entity record flags (bits 31, 35-36, 39)
89        // =================================================================
90        const ENTITY_INCLUDE_RECORD_UNMAPPED_DATA = 1 << 31;
91        const ENTITY_INCLUDE_RECORD_FEATURE_DETAILS = 1 << 35;
92        const ENTITY_INCLUDE_RECORD_FEATURE_STATS = 1 << 36;
93        const ENTITY_INCLUDE_RECORD_DATES = 1 << 39;
94
95        // =================================================================
96        // Search flags (bits 32, 37-38)
97        // Note: bits 0-3 are aliased as search flags (same as export flags)
98        // =================================================================
99        const SEARCH_INCLUDE_ALL_CANDIDATES = 1 << 32;
100        const FIND_NETWORK_INCLUDE_MATCHING_INFO = 1 << 33;
101        const INCLUDE_MATCH_KEY_DETAILS = 1 << 34;
102        const SEARCH_INCLUDE_REQUEST = 1 << 37;
103        const SEARCH_INCLUDE_REQUEST_DETAILS = 1 << 38;
104
105        // =================================================================
106        // With info flag (bit 62)
107        // =================================================================
108        const WITH_INFO = 1 << 62;
109
110        // =================================================================
111        // Search flags that alias export flags (bits 0-3)
112        // These have the same bit values as their export counterparts
113        // =================================================================
114        const SEARCH_INCLUDE_RESOLVED = 1 << 0;  // Same as EXPORT_INCLUDE_MULTI_RECORD_ENTITIES
115        const SEARCH_INCLUDE_POSSIBLY_SAME = 1 << 1;  // Same as EXPORT_INCLUDE_POSSIBLY_SAME
116        const SEARCH_INCLUDE_POSSIBLY_RELATED = 1 << 2;  // Same as EXPORT_INCLUDE_POSSIBLY_RELATED
117        const SEARCH_INCLUDE_NAME_ONLY = 1 << 3;  // Same as EXPORT_INCLUDE_NAME_ONLY
118
119        // =================================================================
120        // Composite flags - Export
121        // =================================================================
122        const EXPORT_INCLUDE_ALL_ENTITIES = Self::EXPORT_INCLUDE_MULTI_RECORD_ENTITIES.bits()
123            | Self::EXPORT_INCLUDE_SINGLE_RECORD_ENTITIES.bits();
124
125        const EXPORT_INCLUDE_ALL_HAVING_RELATIONSHIPS = Self::EXPORT_INCLUDE_POSSIBLY_SAME.bits()
126            | Self::EXPORT_INCLUDE_POSSIBLY_RELATED.bits()
127            | Self::EXPORT_INCLUDE_NAME_ONLY.bits()
128            | Self::EXPORT_INCLUDE_DISCLOSED.bits();
129
130        // =================================================================
131        // Composite flags - Entity relations
132        // =================================================================
133        const ENTITY_INCLUDE_ALL_RELATIONS = Self::ENTITY_INCLUDE_POSSIBLY_SAME_RELATIONS.bits()
134            | Self::ENTITY_INCLUDE_POSSIBLY_RELATED_RELATIONS.bits()
135            | Self::ENTITY_INCLUDE_NAME_ONLY_RELATIONS.bits()
136            | Self::ENTITY_INCLUDE_DISCLOSED_RELATIONS.bits();
137
138        // =================================================================
139        // Composite flags - Search
140        // =================================================================
141        const SEARCH_INCLUDE_ALL_ENTITIES = Self::SEARCH_INCLUDE_RESOLVED.bits()
142            | Self::SEARCH_INCLUDE_POSSIBLY_SAME.bits()
143            | Self::SEARCH_INCLUDE_POSSIBLY_RELATED.bits()
144            | Self::SEARCH_INCLUDE_NAME_ONLY.bits();
145
146        // =================================================================
147        // Composite flags - Record
148        // =================================================================
149        const RECORD_ALL_FLAGS = Self::ENTITY_INCLUDE_INTERNAL_FEATURES.bits()
150            | Self::ENTITY_INCLUDE_RECORD_FEATURES.bits()
151            | Self::ENTITY_INCLUDE_RECORD_FEATURE_DETAILS.bits()
152            | Self::ENTITY_INCLUDE_RECORD_FEATURE_STATS.bits()
153            | Self::ENTITY_INCLUDE_RECORD_DATES.bits()
154            | Self::ENTITY_INCLUDE_RECORD_JSON_DATA.bits()
155            | Self::ENTITY_INCLUDE_RECORD_UNMAPPED_DATA.bits();
156
157        const RECORD_PREVIEW_ALL_FLAGS = Self::ENTITY_INCLUDE_INTERNAL_FEATURES.bits()
158            | Self::ENTITY_INCLUDE_RECORD_FEATURES.bits()
159            | Self::ENTITY_INCLUDE_RECORD_FEATURE_DETAILS.bits()
160            | Self::ENTITY_INCLUDE_RECORD_FEATURE_STATS.bits()
161            | Self::ENTITY_INCLUDE_RECORD_JSON_DATA.bits()
162            | Self::ENTITY_INCLUDE_RECORD_UNMAPPED_DATA.bits();
163
164        // =================================================================
165        // Core entity flags (used in defaults)
166        // =================================================================
167        const ENTITY_CORE_FLAGS = Self::ENTITY_INCLUDE_REPRESENTATIVE_FEATURES.bits()
168            | Self::ENTITY_INCLUDE_ENTITY_NAME.bits()
169            | Self::ENTITY_INCLUDE_RECORD_SUMMARY.bits()
170            | Self::ENTITY_INCLUDE_RECORD_DATA.bits()
171            | Self::ENTITY_INCLUDE_RECORD_MATCHING_INFO.bits();
172    }
173}
174
175impl Default for SzFlags {
176    fn default() -> Self {
177        SzFlags::empty()
178    }
179}
180
181impl SzFlags {
182    /// No flags set
183    pub const NO_FLAGS: SzFlags = SzFlags::empty();
184
185    // =========================================================================
186    // Record defaults
187    // =========================================================================
188
189    /// Default flags for record operations
190    pub const RECORD_DEFAULT_FLAGS: SzFlags = SzFlags::ENTITY_INCLUDE_RECORD_JSON_DATA;
191
192    /// Default flags for record preview operations
193    pub const RECORD_PREVIEW_DEFAULT_FLAGS: SzFlags =
194        SzFlags::ENTITY_INCLUDE_RECORD_FEATURE_DETAILS;
195
196    // =========================================================================
197    // Entity defaults
198    // =========================================================================
199
200    /// Default flags for entity operations
201    pub const ENTITY_DEFAULT_FLAGS: SzFlags = SzFlags::from_bits_truncate(
202        SzFlags::ENTITY_CORE_FLAGS.bits()
203            | SzFlags::ENTITY_INCLUDE_ALL_RELATIONS.bits()
204            | SzFlags::ENTITY_INCLUDE_RELATED_ENTITY_NAME.bits()
205            | SzFlags::ENTITY_INCLUDE_RELATED_RECORD_SUMMARY.bits()
206            | SzFlags::ENTITY_INCLUDE_RELATED_MATCHING_INFO.bits(),
207    );
208
209    /// Brief default flags for entity operations
210    pub const ENTITY_BRIEF_DEFAULT_FLAGS: SzFlags = SzFlags::from_bits_truncate(
211        SzFlags::ENTITY_INCLUDE_ALL_RELATIONS.bits()
212            | SzFlags::ENTITY_INCLUDE_RECORD_MATCHING_INFO.bits()
213            | SzFlags::ENTITY_INCLUDE_RELATED_MATCHING_INFO.bits(),
214    );
215
216    // =========================================================================
217    // Export defaults
218    // =========================================================================
219
220    /// Default flags for export operations
221    pub const EXPORT_DEFAULT_FLAGS: SzFlags = SzFlags::from_bits_truncate(
222        SzFlags::EXPORT_INCLUDE_ALL_ENTITIES.bits() | SzFlags::ENTITY_DEFAULT_FLAGS.bits(),
223    );
224
225    // =========================================================================
226    // Find path defaults
227    // =========================================================================
228
229    /// Default flags for find path operations
230    pub const FIND_PATH_DEFAULT_FLAGS: SzFlags = SzFlags::from_bits_truncate(
231        SzFlags::FIND_PATH_INCLUDE_MATCHING_INFO.bits()
232            | SzFlags::ENTITY_INCLUDE_ENTITY_NAME.bits()
233            | SzFlags::ENTITY_INCLUDE_RECORD_SUMMARY.bits(),
234    );
235
236    // =========================================================================
237    // Find network defaults
238    // =========================================================================
239
240    /// Default flags for find network operations
241    pub const FIND_NETWORK_DEFAULT_FLAGS: SzFlags = SzFlags::from_bits_truncate(
242        SzFlags::FIND_NETWORK_INCLUDE_MATCHING_INFO.bits()
243            | SzFlags::ENTITY_INCLUDE_ENTITY_NAME.bits()
244            | SzFlags::ENTITY_INCLUDE_RECORD_SUMMARY.bits(),
245    );
246
247    // =========================================================================
248    // Search by attributes defaults
249    // =========================================================================
250
251    /// All search by attributes flags
252    pub const SEARCH_BY_ATTRIBUTES_ALL: SzFlags = SzFlags::from_bits_truncate(
253        SzFlags::SEARCH_INCLUDE_ALL_ENTITIES.bits()
254            | SzFlags::SEARCH_INCLUDE_STATS.bits()
255            | SzFlags::ENTITY_INCLUDE_REPRESENTATIVE_FEATURES.bits()
256            | SzFlags::ENTITY_INCLUDE_ENTITY_NAME.bits()
257            | SzFlags::ENTITY_INCLUDE_RECORD_SUMMARY.bits()
258            | SzFlags::INCLUDE_FEATURE_SCORES.bits(),
259    );
260
261    /// Strong search by attributes flags
262    pub const SEARCH_BY_ATTRIBUTES_STRONG: SzFlags = SzFlags::from_bits_truncate(
263        SzFlags::SEARCH_INCLUDE_RESOLVED.bits()
264            | SzFlags::SEARCH_INCLUDE_POSSIBLY_SAME.bits()
265            | SzFlags::SEARCH_INCLUDE_STATS.bits()
266            | SzFlags::ENTITY_INCLUDE_REPRESENTATIVE_FEATURES.bits()
267            | SzFlags::ENTITY_INCLUDE_ENTITY_NAME.bits()
268            | SzFlags::ENTITY_INCLUDE_RECORD_SUMMARY.bits()
269            | SzFlags::INCLUDE_FEATURE_SCORES.bits(),
270    );
271
272    /// Minimal all search by attributes flags
273    pub const SEARCH_BY_ATTRIBUTES_MINIMAL_ALL: SzFlags = SzFlags::from_bits_truncate(
274        SzFlags::SEARCH_INCLUDE_ALL_ENTITIES.bits() | SzFlags::SEARCH_INCLUDE_STATS.bits(),
275    );
276
277    /// Minimal strong search by attributes flags
278    pub const SEARCH_BY_ATTRIBUTES_MINIMAL_STRONG: SzFlags = SzFlags::from_bits_truncate(
279        SzFlags::SEARCH_INCLUDE_RESOLVED.bits()
280            | SzFlags::SEARCH_INCLUDE_POSSIBLY_SAME.bits()
281            | SzFlags::SEARCH_INCLUDE_STATS.bits(),
282    );
283
284    /// Default flags for search by attributes operations
285    pub const SEARCH_BY_ATTRIBUTES_DEFAULT_FLAGS: SzFlags = Self::SEARCH_BY_ATTRIBUTES_ALL;
286
287    // =========================================================================
288    // Why defaults
289    // =========================================================================
290
291    /// Default flags for why entities operations
292    pub const WHY_ENTITIES_DEFAULT_FLAGS: SzFlags = SzFlags::INCLUDE_FEATURE_SCORES;
293
294    /// Default flags for why records operations
295    pub const WHY_RECORDS_DEFAULT_FLAGS: SzFlags = SzFlags::INCLUDE_FEATURE_SCORES;
296
297    /// Default flags for why record in entity operations
298    pub const WHY_RECORD_IN_ENTITY_DEFAULT_FLAGS: SzFlags = SzFlags::INCLUDE_FEATURE_SCORES;
299
300    /// Default flags for why search operations
301    pub const WHY_SEARCH_DEFAULT_FLAGS: SzFlags = SzFlags::from_bits_truncate(
302        SzFlags::INCLUDE_FEATURE_SCORES.bits()
303            | SzFlags::SEARCH_INCLUDE_REQUEST_DETAILS.bits()
304            | SzFlags::SEARCH_INCLUDE_STATS.bits(),
305    );
306
307    // =========================================================================
308    // How defaults
309    // =========================================================================
310
311    /// Default flags for how entity operations
312    pub const HOW_ENTITY_DEFAULT_FLAGS: SzFlags = SzFlags::INCLUDE_FEATURE_SCORES;
313
314    /// All flags for how entity operations
315    pub const HOW_ALL_FLAGS: SzFlags = SzFlags::from_bits_truncate(
316        SzFlags::INCLUDE_MATCH_KEY_DETAILS.bits() | SzFlags::INCLUDE_FEATURE_SCORES.bits(),
317    );
318
319    // =========================================================================
320    // Virtual entity defaults
321    // =========================================================================
322
323    /// Default flags for virtual entity operations
324    pub const VIRTUAL_ENTITY_DEFAULT_FLAGS: SzFlags = SzFlags::ENTITY_CORE_FLAGS;
325
326    /// All flags for virtual entity operations
327    pub const VIRTUAL_ENTITY_ALL_FLAGS: SzFlags = SzFlags::from_bits_truncate(
328        SzFlags::ENTITY_INCLUDE_ALL_FEATURES.bits()
329            | SzFlags::ENTITY_INCLUDE_REPRESENTATIVE_FEATURES.bits()
330            | SzFlags::ENTITY_INCLUDE_ENTITY_NAME.bits()
331            | SzFlags::ENTITY_INCLUDE_RECORD_SUMMARY.bits()
332            | SzFlags::ENTITY_INCLUDE_RECORD_TYPES.bits()
333            | SzFlags::ENTITY_INCLUDE_RECORD_DATA.bits()
334            | SzFlags::ENTITY_INCLUDE_RECORD_MATCHING_INFO.bits()
335            | SzFlags::ENTITY_INCLUDE_RECORD_DATES.bits()
336            | SzFlags::ENTITY_INCLUDE_RECORD_JSON_DATA.bits()
337            | SzFlags::ENTITY_INCLUDE_RECORD_UNMAPPED_DATA.bits()
338            | SzFlags::ENTITY_INCLUDE_RECORD_FEATURES.bits()
339            | SzFlags::ENTITY_INCLUDE_RECORD_FEATURE_DETAILS.bits()
340            | SzFlags::ENTITY_INCLUDE_RECORD_FEATURE_STATS.bits()
341            | SzFlags::ENTITY_INCLUDE_INTERNAL_FEATURES.bits()
342            | SzFlags::ENTITY_INCLUDE_FEATURE_STATS.bits(),
343    );
344
345    // =========================================================================
346    // Add/Delete/Reevaluate defaults
347    // =========================================================================
348
349    /// Default flags for adding records
350    pub const ADD_RECORD_DEFAULT_FLAGS: SzFlags = SzFlags::empty();
351
352    /// All flags for adding records (with info)
353    pub const ADD_RECORD_ALL_FLAGS: SzFlags = SzFlags::WITH_INFO;
354
355    /// Default flags for deleting records
356    pub const DELETE_RECORD_DEFAULT_FLAGS: SzFlags = SzFlags::empty();
357
358    /// All flags for deleting records (with info)
359    pub const DELETE_RECORD_ALL_FLAGS: SzFlags = SzFlags::WITH_INFO;
360
361    /// Default flags for reevaluating records
362    pub const REEVALUATE_RECORD_DEFAULT_FLAGS: SzFlags = SzFlags::empty();
363
364    /// All flags for reevaluating records (with info)
365    pub const REEVALUATE_RECORD_ALL_FLAGS: SzFlags = SzFlags::WITH_INFO;
366
367    /// Default flags for reevaluating entities
368    pub const REEVALUATE_ENTITY_DEFAULT_FLAGS: SzFlags = SzFlags::empty();
369
370    /// All flags for reevaluating entities (with info)
371    pub const REEVALUATE_ENTITY_ALL_FLAGS: SzFlags = SzFlags::WITH_INFO;
372
373    /// Default flags for redo operations
374    pub const REDO_DEFAULT_FLAGS: SzFlags = SzFlags::empty();
375
376    /// All flags for redo operations (with info)
377    pub const REDO_ALL_FLAGS: SzFlags = SzFlags::WITH_INFO;
378
379    // =========================================================================
380    // Find interesting entities defaults
381    // =========================================================================
382
383    /// Default flags for find interesting entities operations
384    pub const FIND_INTERESTING_ENTITIES_DEFAULT_FLAGS: SzFlags = SzFlags::empty();
385
386    /// All flags for find interesting entities operations
387    pub const FIND_INTERESTING_ENTITIES_ALL_FLAGS: SzFlags = SzFlags::empty();
388
389    // =========================================================================
390    // Utility methods
391    // =========================================================================
392
393    /// Converts optional flags to i64 for FFI calls
394    ///
395    /// This helper consolidates the common pattern of converting `Option<SzFlags>`
396    /// to the i64 value expected by FFI functions.
397    #[inline]
398    pub fn to_ffi(flags: Option<SzFlags>, default: SzFlags) -> i64 {
399        flags.unwrap_or(default).bits() as i64
400    }
401}