custom.rs (4247B)
1 #[cfg(test)] 2 mod tests; 3 use super::{AuthTransports, AuthenticatorTransport, CredentialId, CredentialIdErr}; 4 use core::iter::FusedIterator; 5 impl<'a: 'b, 'b> TryFrom<&'a [u8]> for CredentialId<&'b [u8]> { 6 type Error = CredentialIdErr; 7 #[inline] 8 fn try_from(value: &'a [u8]) -> Result<Self, Self::Error> { 9 Self::from_slice(value) 10 } 11 } 12 impl TryFrom<Box<[u8]>> for CredentialId<Box<[u8]>> { 13 type Error = CredentialIdErr; 14 #[inline] 15 fn try_from(value: Box<[u8]>) -> Result<Self, Self::Error> { 16 match CredentialId::<&[u8]>::try_from(&*value) { 17 Ok(_) => Ok(Self(value)), 18 Err(e) => Err(e), 19 } 20 } 21 } 22 /// [`Iterator`] of [`AuthenticatorTransport`]s returned from 23 /// [`AuthTransports::into_iter`]. 24 #[derive(Debug)] 25 pub struct AuthTransportIter(AuthTransports); 26 impl Iterator for AuthTransportIter { 27 type Item = AuthenticatorTransport; 28 #[inline] 29 fn next(&mut self) -> Option<Self::Item> { 30 let mut nxt = self.0.remove(AuthenticatorTransport::Ble); 31 if self.0.0 != nxt.0 { 32 self.0 = nxt; 33 return Some(AuthenticatorTransport::Ble); 34 } 35 nxt = self.0.remove(AuthenticatorTransport::Hybrid); 36 if self.0.0 != nxt.0 { 37 self.0 = nxt; 38 return Some(AuthenticatorTransport::Hybrid); 39 } 40 nxt = self.0.remove(AuthenticatorTransport::Internal); 41 if self.0.0 != nxt.0 { 42 self.0 = nxt; 43 return Some(AuthenticatorTransport::Internal); 44 } 45 nxt = self.0.remove(AuthenticatorTransport::Nfc); 46 if self.0.0 != nxt.0 { 47 self.0 = nxt; 48 return Some(AuthenticatorTransport::Nfc); 49 } 50 nxt = self.0.remove(AuthenticatorTransport::SmartCard); 51 if self.0.0 != nxt.0 { 52 self.0 = nxt; 53 return Some(AuthenticatorTransport::SmartCard); 54 } 55 nxt = self.0.remove(AuthenticatorTransport::Usb); 56 if self.0.0 == nxt.0 { 57 None 58 } else { 59 self.0 = nxt; 60 Some(AuthenticatorTransport::Usb) 61 } 62 } 63 #[inline] 64 fn size_hint(&self) -> (usize, Option<usize>) { 65 let count = self.len(); 66 (count, Some(count)) 67 } 68 #[inline] 69 fn count(self) -> usize 70 where 71 Self: Sized, 72 { 73 self.len() 74 } 75 #[inline] 76 fn last(mut self) -> Option<Self::Item> 77 where 78 Self: Sized, 79 { 80 self.next_back() 81 } 82 } 83 impl ExactSizeIterator for AuthTransportIter { 84 #[expect(clippy::as_conversions, reason = "comment justifies correctness")] 85 #[inline] 86 fn len(&self) -> usize { 87 // Maximum count is 6, so this is fine. 88 self.0.count() as usize 89 } 90 } 91 impl DoubleEndedIterator for AuthTransportIter { 92 #[inline] 93 fn next_back(&mut self) -> Option<Self::Item> { 94 let mut nxt = self.0.remove(AuthenticatorTransport::Usb); 95 if self.0.0 != nxt.0 { 96 self.0 = nxt; 97 return Some(AuthenticatorTransport::Usb); 98 } 99 nxt = self.0.remove(AuthenticatorTransport::SmartCard); 100 if self.0.0 != nxt.0 { 101 self.0 = nxt; 102 return Some(AuthenticatorTransport::SmartCard); 103 } 104 nxt = self.0.remove(AuthenticatorTransport::Nfc); 105 if self.0.0 != nxt.0 { 106 self.0 = nxt; 107 return Some(AuthenticatorTransport::Nfc); 108 } 109 nxt = self.0.remove(AuthenticatorTransport::Internal); 110 if self.0.0 != nxt.0 { 111 self.0 = nxt; 112 return Some(AuthenticatorTransport::Internal); 113 } 114 nxt = self.0.remove(AuthenticatorTransport::Hybrid); 115 if self.0.0 != nxt.0 { 116 self.0 = nxt; 117 return Some(AuthenticatorTransport::Hybrid); 118 } 119 nxt = self.0.remove(AuthenticatorTransport::Ble); 120 if self.0.0 == nxt.0 { 121 None 122 } else { 123 self.0 = nxt; 124 Some(AuthenticatorTransport::Ble) 125 } 126 } 127 } 128 impl FusedIterator for AuthTransportIter {} 129 impl IntoIterator for AuthTransports { 130 type Item = AuthenticatorTransport; 131 type IntoIter = AuthTransportIter; 132 #[inline] 133 fn into_iter(self) -> Self::IntoIter { 134 AuthTransportIter(self) 135 } 136 }