#![no_std]
#[allow(unused_imports)]
use core::{fmt, mem, ptr, slice, str};
#[cfg(any(test, feature = "std"))]
#[macro_use]
extern crate std;
#[macro_use]
mod encoding;
#[macro_use]
mod arch;
mod ratio;
pub use self::ratio::Ratio;
mod pad;
pub use self::pad::*;
pub use Padding::None as NoPad;
mod buf;
pub use self::buf::*;
mod hex;
pub use self::hex::*;
mod base64;
pub use self::base64::*;
mod base32;
pub use self::base32::*;
pub mod incremental;
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
#[non_exhaustive]
pub enum Error {
InvalidCharacter,
IncorrectLength,
NonCanonical,
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.write_str(match self {
Error::InvalidCharacter => "invalid character",
Error::IncorrectLength => "incorrect length",
Error::NonCanonical => "non-canonical input",
})
}
}
#[cfg(feature = "std")]
impl std::error::Error for Error {}
#[derive(Clone, Debug)]
pub struct Display<'a, E> {
encoding: &'a E,
bytes: &'a [u8],
}
impl<'a, E: Encoding> Display<'a, E> {
#[inline]
pub fn new(encoding: &'a E, bytes: &'a [u8]) -> Self {
Self { encoding, bytes }
}
}
impl<'a, E: Encoding> fmt::Display for Display<'a, E> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
let mut stack_buf = mem::MaybeUninit::<[u8; 512]>::uninit();
let chunk_size = E::RATIO.encoding_chunk_size(mem::size_of_val(&stack_buf));
for chunk in self.bytes.chunks(chunk_size) {
let string = self.encoding.encode_into(chunk, &mut stack_buf);
f.write_str(string)?;
}
Ok(())
}
}
pub trait Encoding {
const RATIO: Ratio;
fn encode_into<B: EncodeBuf>(&self, bytes: &[u8], buffer: B) -> B::Output;
fn decode_into<B: DecodeBuf>(&self, string: &[u8], buffer: B) -> Result<B::Output, Error>;
}