rustls_native_certs/
rustls.rs1use rustls::RootCertStore;
2use std::io::{Error, ErrorKind};
3use std::io::BufRead;
4use crate::RootStoreBuilder;
5
6pub type PartialResult<T, E> = Result<T, (Option<T>, E)>;
11
12pub fn load_native_certs() -> PartialResult<RootCertStore, Error> {
25 struct RootCertStoreLoader {
26 store: RootCertStore,
27 };
28 impl RootStoreBuilder for RootCertStoreLoader {
29 fn load_der(&mut self, der: Vec<u8>) -> Result<(), Error> {
30 self.store.add(&rustls::Certificate(der))
31 .map_err(|err| Error::new(ErrorKind::InvalidData, err))
32 }
33 fn load_pem_file(&mut self, rd: &mut dyn BufRead) -> Result<(), Error> {
34 self.store.add_pem_file(rd)
35 .map(|_| ())
36 .map_err(|()| Error::new(ErrorKind::InvalidData, format!("could not load PEM file")))
37 }
38 }
39 let mut loader = RootCertStoreLoader {
40 store: RootCertStore::empty(),
41 };
42 match crate::build_native_certs(&mut loader) {
43 Err(err) if loader.store.is_empty() => Err((None, err)),
44 Err(err) => Err((Some(loader.store), err)),
45 Ok(()) => Ok(loader.store),
46 }
47}