#[derive(Debug)]
pub enum RootCertificateStoreLoadError
{
CouldNotOpenCertificateAuthoritiesPemFile(PathBuf, io::Error),
CouldNotReadCertificateAuthoritiesPemFile(PathBuf),
NoValidCertificateAuthoritiesInCertificateAuthoritiesPemFiles,
}
impl Display for RootCertificateStoreLoadError
{
#[inline(always)]
fn fmt(&self, f: &mut Formatter) -> fmt::Result
{
Debug::fmt(self, f)
}
}
impl error::Error for RootCertificateStoreLoadError
{
#[inline(always)]
fn source(&self) -> Option<&(error::Error + 'static)>
{
use self::RootCertificateStoreLoadError::*;
match self
{
&CouldNotOpenCertificateAuthoritiesPemFile(ref _path, ref error) => Some(error),
&CouldNotReadCertificateAuthoritiesPemFile(..) => None,
&NoValidCertificateAuthoritiesInCertificateAuthoritiesPemFiles => None,
}
}
}
impl RootCertificateStoreLoadError
{
#[inline(always)]
pub fn root_certificate_store(certificate_authority_root_certificates_files: &[PathBuf]) -> Result<RootCertStore, Self>
{
use self::RootCertificateStoreLoadError::*;
let mut root_certificate_store = RootCertStore::empty();
let mut total_valid_count = 0;
for certificate_authority_root_certificates_file in certificate_authority_root_certificates_files.iter()
{
let file = File::open(certificate_authority_root_certificates_file).map_err(|error| CouldNotOpenCertificateAuthoritiesPemFile(certificate_authority_root_certificates_file.to_path_buf(), error))?;
let mut buf_reader = BufReader::new(file);
let (valid_count, _invalid_count) = root_certificate_store.add_pem_file(&mut buf_reader).map_err(|_| CouldNotReadCertificateAuthoritiesPemFile(certificate_authority_root_certificates_file.to_path_buf()))?;
total_valid_count += valid_count;
}
if unlikely!(total_valid_count == 0)
{
Err(NoValidCertificateAuthoritiesInCertificateAuthoritiesPemFiles)
}
else
{
Ok(root_certificate_store)
}
}
}