use super::{Disposition, DispositionRecord, DispositionSet, DispositionSetError, KindSet};
use core::marker::PhantomData;
impl<Set: KindSet> DispositionSet<Set> {
pub fn complete(record: Set::Dispositions) -> Result<Self, DispositionSetError> {
let rows: Vec<_> = record.into_dispositions().collect();
let expected = Set::NAMES.len();
let observed = rows.len();
if expected != observed {
return Err(DispositionSetError::CountMismatch { expected, observed });
}
for ((observed_name, _), expected_name) in rows.iter().zip(Set::NAMES.iter().copied()) {
if *observed_name != expected_name {
return Err(DispositionSetError::KindMismatch {
expected: expected_name,
observed: observed_name,
});
}
}
Ok(Self {
dispositions: rows
.into_iter()
.map(|(_name, disposition)| disposition)
.collect(),
kind_set: PhantomData,
})
}
#[must_use]
pub const fn len(&self) -> usize {
self.dispositions.len()
}
#[must_use]
pub const fn is_empty(&self) -> bool {
self.dispositions.is_empty()
}
#[must_use]
pub fn iter(&self) -> impl ExactSizeIterator<Item = (&'static str, &Disposition)> {
Set::NAMES.iter().copied().zip(self.dispositions.iter())
}
}