Documentation
use std::iter::Iterator;

pub(crate) mod der;
pub(crate) mod x509;

enum CertType {
    X509 = 0,
    RawPublicKey = 2,
}

impl CertType {
    fn to_byte(self) -> u8 {
        self as u8
    }
}

pub(crate) struct CertEntry<'a> {
    pub(crate) data: &'a [u8],
    pub(crate) extensions: &'a [u8],
}

pub(crate) struct CertIter<'a> {
    cert_list: &'a [u8],
}

impl<'a> CertIter<'a> {
    pub(crate) fn new(cert_list: &'a [u8]) -> Self {
        Self {
            cert_list: cert_list,
        }
    }
}

impl<'a> Iterator for CertIter<'a> {
    type Item = CertEntry<'a>;

    fn next(&mut self) -> Option<CertEntry<'a>> {
        if self.cert_list.len() < 5 {
            return None;
        }
        let data_len =
            u32::from_be_bytes([0, self.cert_list[0], self.cert_list[1], self.cert_list[2]])
                as usize;
        if data_len > self.cert_list.len() - 5 {
            return None;
        }
        let extensions_len = u16::from_be_bytes([
            self.cert_list[3 + data_len],
            self.cert_list[3 + data_len + 1],
        ]) as usize;
        if extensions_len > self.cert_list.len() - 5 - data_len {
            return None;
        }
        let cert = CertEntry {
            data: &self.cert_list[3..][..data_len],
            extensions: &self.cert_list[3 + data_len + 2..][..extensions_len],
        };
        self.cert_list = &self.cert_list[5 + data_len + extensions_len..];
        Some(cert)
    }
}