webauthn_rp

WebAuthn RP library.
git clone https://git.philomathiclife.com/repos/webauthn_rp
Log | Files | Refs | README

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 }