#![warn(unused_results)]
#[macro_use]
mod tool;
pub mod base;
pub mod encode;
pub mod decode;
macro_rules! ascii {
($($v: expr),*) => { &[
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
$($v),*,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
] };
}
macro_rules! base {
(#[$d: meta] $(#[$a: meta])* mod $n: ident;
$b: expr, $p: expr, $r: expr, $s: expr, $($v: expr),*,) =>
{
#[$d]
$(#[$a])*
pub mod $n {
use ::decode::Error;
const X_: u8 = 128;
pub enum Static {}
static BASE: ::base::Opt<Static> = ::base::Opt {
val: ascii!($($v),*), sym: $s, bit: $b, pad: $p,
_phantom: ::std::marker::PhantomData
};
pub fn base() -> &'static ::base::Opt<Static> {
&BASE
}
pub fn encode_len(len: usize) -> usize {
::encode::encode_len(&BASE, len)
}
pub fn encode_nopad_len(len: usize) -> usize {
::encode::encode_nopad_len(&BASE, len)
}
pub fn decode_len(len: usize) -> usize {
::decode::decode_len(&BASE, len)
}
pub fn decode_nopad_len(len: usize) -> Result<usize, Error> {
::decode::decode_nopad_len(&BASE, len)
}
pub fn encode_mut(input: &[u8], output: &mut [u8]) {
::encode::encode_mut(&BASE, input, output)
}
pub fn encode_nopad_mut(input: &[u8], output: &mut [u8]) {
::encode::encode_nopad_mut(&BASE, input, output)
}
pub fn decode_mut(input: &[u8], output: &mut [u8]) -> Result<usize, Error> {
::decode::decode_mut(&BASE, input, output)
}
pub fn decode_nopad_mut(input: &[u8], output: &mut [u8]) -> Result<(), Error> {
::decode::decode_nopad_mut(&BASE, input, output)
}
pub fn encode(input: &[u8]) -> String {
::encode::encode(&BASE, input)
}
pub fn encode_nopad(input: &[u8]) -> String {
::encode::encode_nopad(&BASE, input)
}
pub fn decode(input: &[u8]) -> Result<Vec<u8>, Error> {
::decode::decode(&BASE, input)
}
pub fn decode_nopad(input: &[u8]) -> Result<Vec<u8>, Error> {
::decode::decode_nopad(&BASE, input)
}
#[test]
fn check() {
use base::{Spec, equal, valid};
const SPEC: Spec = Spec { val: $r, pad: $p };
assert_eq!(BASE.val.len(), 256);
assert_eq!(BASE.sym.len(), 1 << BASE.bit);
valid(&SPEC).unwrap();
valid(&BASE).unwrap();
equal(&BASE, &SPEC).unwrap();
}
}
};
}
base!{
mod base2;
1, b'=', &[(b'0', b'1')], b"01",
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
0_, 1_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
}
base!{
mod base4;
2, b'=', &[(b'0', b'3')], b"0123",
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
0_, 1_, 2_, 3_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
}
base!{
mod base8;
3, b'=', &[(b'0', b'7')], b"01234567",
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
0_, 1_, 2_, 3_, 4_, 5_, 6_, 7_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
}
base!{
mod base16;
4, b'=', &[(b'0', b'9'), (b'A', b'F')], b"0123456789ABCDEF",
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
0_, 1_, 2_, 3_, 4_, 5_, 6_, 7_, 8_, 9_, X_, X_, X_, X_, X_, X_,
X_, 10, 11, 12, 13, 14, 15, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
}
pub use base16 as hex;
base!{
mod base32;
5, b'=', &[(b'A', b'Z'), (b'2', b'7')],
b"ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, 26, 27, 28, 29, 30, 31, X_, X_, X_, X_, X_, X_, X_, X_,
X_, 0_, 1_, 2_, 3_, 4_, 5_, 6_, 7_, 8_, 9_, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
}
base!{
mod base32hex;
5, b'=', &[(b'0', b'9'), (b'A', b'V')],
b"0123456789ABCDEFGHIJKLMNOPQRSTUV",
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
0_, 1_, 2_, 3_, 4_, 5_, 6_, 7_, 8_, 9_, X_, X_, X_, X_, X_, X_,
X_, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_,
}
base!{
mod base64;
6, b'=', &[(b'A', b'Z'), (b'a', b'z'), (b'0', b'9'), (b'+', b'+'), (b'/', b'/')],
b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, 62, X_, X_, X_, 63,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, X_, X_, X_, X_, X_, X_,
X_, 0_, 1_, 2_, 3_, 4_, 5_, 6_, 7_, 8_, 9_, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, X_, X_, X_, X_, X_,
X_, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, X_, X_, X_, X_, X_,
}
base!{
mod base64url;
6, b'=', &[(b'A', b'Z'), (b'a', b'z'), (b'0', b'9'), (b'-', b'-'), (b'_', b'_')],
b"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",
X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, X_, 62, X_, X_,
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, X_, X_, X_, X_, X_, X_,
X_, 0_, 1_, 2_, 3_, 4_, 5_, 6_, 7_, 8_, 9_, 10, 11, 12, 13, 14,
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, X_, X_, X_, X_, 63,
X_, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, X_, X_, X_, X_, X_,
}