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}