macroonz_compiler/kind/
type_guard.rs1use super::{Disposition, DispositionRecord, DispositionSet, DispositionSetError, KindSet};
4use core::marker::PhantomData;
5
6impl<Set: KindSet> DispositionSet<Set> {
7 pub fn complete(record: Set::Dispositions) -> Result<Self, DispositionSetError> {
15 let rows: Vec<_> = record.into_dispositions().collect();
16 let expected = Set::NAMES.len();
17 let observed = rows.len();
18 if expected != observed {
19 return Err(DispositionSetError::CountMismatch { expected, observed });
20 }
21 for ((observed_name, _), expected_name) in rows.iter().zip(Set::NAMES.iter().copied()) {
22 if *observed_name != expected_name {
23 return Err(DispositionSetError::KindMismatch {
24 expected: expected_name,
25 observed: observed_name,
26 });
27 }
28 }
29 Ok(Self {
30 dispositions: rows
31 .into_iter()
32 .map(|(_name, disposition)| disposition)
33 .collect(),
34 kind_set: PhantomData,
35 })
36 }
37
38 #[must_use]
40 pub const fn len(&self) -> usize {
41 self.dispositions.len()
42 }
43
44 #[must_use]
46 pub const fn is_empty(&self) -> bool {
47 self.dispositions.is_empty()
48 }
49
50 #[must_use]
52 pub fn iter(&self) -> impl ExactSizeIterator<Item = (&'static str, &Disposition)> {
53 Set::NAMES.iter().copied().zip(self.dispositions.iter())
54 }
55}