Documentation
use std::{fs::File, io::Read};

use crate::error::{Error, Result};

pub struct Identity {}

impl Identity {
    pub fn from_pkcs12_file(path: &str, password: &str) -> Result<reqwest::Identity> {
        let mut buf = Vec::new();

        let mut file = File::open(path).map_err(|source| Error::ReadError { source })?;

        file.read_to_end(&mut buf)
            .map_err(|source| Error::ReadError { source })?;

        match reqwest::Identity::from_pkcs12_der(&buf, password) {
            Ok(identify) => Ok(identify),
            Err(error) => Err(Error::Pkcs12Error { source: error }),
        }
    }

    pub fn from_vec(der: Vec<u8>, password: &str) -> Result<reqwest::Identity> {
        match reqwest::Identity::from_pkcs12_der(&der, password) {
            Ok(identify) => Ok(identify),
            Err(error) => Err(Error::Pkcs12Error { source: error }),
        }
    }
}

pub struct Certificate {}

impl Certificate {
    #[allow(dead_code)]
    pub fn from_file(path: &str) -> Result<Vec<reqwest::Certificate>> {
        let mut buf = Vec::new();

        let mut file = File::open(path).map_err(|source| Error::ReadError { source })?;

        file.read_to_end(&mut buf)
            .map_err(|source| Error::ReadError { source })?;

        let pems = pem::parse_many(&buf).map_err(|source| Error::PemError { source })?;

        pems.into_iter()
            .map(|pem| {
                reqwest::Certificate::from_pem(&pem::encode(&pem).into_bytes())
                    .map_err(|source| Error::CertificateError { source })
            })
            .collect::<Result<Vec<_>>>()
    }

    #[allow(dead_code)]
    pub fn from_string(subject: &str) -> Result<Vec<reqwest::Certificate>> {
        let buf: Vec<u8> = subject.into();
        let pems = pem::parse_many(buf).map_err(|source| Error::PemError { source })?;

        pems.into_iter()
            .map(|pem| {
                reqwest::Certificate::from_pem(&pem::encode(&pem).into_bytes())
                    .map_err(|source| Error::CertificateError { source })
            })
            .collect::<Result<Vec<_>>>()
    }
}