Skip to content

Commit 3e92dbb

Browse files
committed
feat: Add JsonTypeSet::len & JsonTypeSet::remove
Signed-off-by: Dmitry Dygalo <[email protected]>
1 parent 345bb71 commit 3e92dbb

File tree

2 files changed

+35
-0
lines changed

2 files changed

+35
-0
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## [Unreleased]
44

5+
### Added
6+
7+
- `JsonTypeSet::len()` and `JsonTypeSet::remove()` helpers for managing type sets.
8+
59
## [0.37.1] - 2025-11-19
610

711
### Fixed

crates/jsonschema/src/types.rs

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,19 @@ impl JsonTypeSet {
117117
self.0 |= ty as u8;
118118
self
119119
}
120+
/// Remove a type from this set and return the modified set.
121+
#[inline]
122+
#[must_use]
123+
pub const fn remove(mut self, ty: JsonType) -> Self {
124+
self.0 &= !(ty as u8);
125+
self
126+
}
127+
/// Return the number of types in this set.
128+
#[inline]
129+
#[must_use]
130+
pub const fn len(self) -> usize {
131+
self.0.count_ones() as usize
132+
}
120133
/// Check if this set includes the specified type.
121134
#[inline]
122135
#[must_use]
@@ -328,6 +341,24 @@ mod tests {
328341
set.contains_value_type(value)
329342
}
330343

344+
#[test]
345+
fn test_remove_types() {
346+
let set = JsonTypeSet::all().remove(JsonType::Number);
347+
assert!(!set.contains(JsonType::Number));
348+
assert!(set.contains(JsonType::Integer));
349+
assert_eq!(set.len(), 6);
350+
351+
let empty = JsonTypeSet::empty();
352+
assert_eq!(empty.remove(JsonType::Boolean), empty);
353+
}
354+
355+
#[test]
356+
fn test_len() {
357+
assert_eq!(JsonTypeSet::empty().len(), 0);
358+
assert_eq!(JsonTypeSet::empty().insert(JsonType::String).len(), 1);
359+
assert_eq!(JsonTypeSet::all().len(), 7);
360+
}
361+
331362
#[test]
332363
fn test_debug_format() {
333364
assert_eq!(format!("{:?}", JsonTypeSet::default()), "()");

0 commit comments

Comments
 (0)