#[macro_use]
extern crate nom;
#[cfg(not(std))]
extern crate core;
mod parsers;
mod base64;
pub use parsers::{pem_block, pem_blocks};
use nom::Err as NomErr;
mod headers;
pub use headers::{HeaderEntry, RFC1423Algorithm, ProcTypeType};
mod display;
use display::{write_base64, write_headers};
#[derive(Debug, PartialEq)]
pub struct Block<'a> {
pub block_type: &'a str,
pub headers: Vec<HeaderEntry<'a>>,
pub data: Vec<u8>,
}
#[derive(Debug)]
pub enum PemParsingError {
NomError(String)
}
pub fn decode_block<'a>(input: &[u8]) -> Result<Block, PemParsingError> {
match pem_block(input) {
Err(NomErr::Error(e)) => {
let error_kind = e.into_error_kind();
Err(PemParsingError::NomError(String::from(error_kind.description())))
}
Err(NomErr::Failure(e)) => {
let error_kind = e.into_error_kind();
Err(PemParsingError::NomError(String::from(error_kind.description())))
}
Err(NomErr::Incomplete(_i)) => Err(PemParsingError::NomError(format!("incomplete: {:?}", _i))),
Ok((_rest, block)) => Ok(block),
}
}
pub fn decode_blocks<'a>(input: &[u8]) -> Result<Vec<Block>, PemParsingError> {
match pem_blocks(input) {
Err(NomErr::Error(e)) => {
let error_kind = e.into_error_kind();
Err(PemParsingError::NomError(String::from(error_kind.description())))
}
Err(NomErr::Failure(e)) => {
let error_kind = e.into_error_kind();
Err(PemParsingError::NomError(String::from(error_kind.description())))
}
Err(NomErr::Incomplete(_i)) => Err(PemParsingError::NomError(format!("incomplete: {:?}", _i))),
Ok((_rest, blocks)) => Ok(blocks),
}
}
#[cfg(not(std))]
use core::fmt;
#[cfg(std)]
use std::fmt;
impl<'a> fmt::Display for Block<'a> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "-----BEGIN {}-----\n", &self.block_type)?;
write_headers(f, &self.headers)?;
write_base64(f, &self.data, 64)?;
write!(f, "-----END {}-----\n", &self.block_type)
}
}