use multibase;
use crate::{Error, Result};
#[derive(Clone, Eq, PartialEq)]
pub struct Multibase {
base: multibase::Base,
data: Option<Vec<u8>>,
}
impl Multibase {
pub fn from_base(base: multibase::Base, data: &[u8]) -> Result<Multibase> {
Ok(Multibase {
base,
data: Some(data.to_vec()),
})
}
pub fn from_char(ch: char, data: &[u8]) -> Result<Multibase> {
let base = match multibase::Base::from_code(ch) {
Ok(base) => Ok(base),
Err(e) => err_at!(BadInput, Err(e), format!("bad char `{}`", ch)),
}?;
Ok(Multibase {
base,
data: Some(data.to_vec()),
})
}
pub fn encode(&self) -> Result<String> {
let text = match &self.data {
Some(data) => multibase::encode(self.base.clone(), data),
None => "".to_string(),
};
Ok(text)
}
pub fn decode(text: &str) -> Result<Multibase> {
let (base, data) = err_at!(BadInput, multibase::decode(text))?;
let val = Multibase {
base,
data: Some(data),
};
Ok(val)
}
pub fn to_base(&self) -> multibase::Base {
self.base.clone()
}
pub fn to_bytes(&self) -> Option<Vec<u8>> {
self.data.clone()
}
}
pub const TABLE: [(&'static str, char, &'static str); 23] = [
(
"identity",
'\0',
"8-bit binary (encoder and decoder keeps data unmodified)",
),
("base2", '0', "binary (01010101)"),
("base8", '7', "octal"),
("base10", '9', "decimal"),
("base16", 'f', "hexadecimal"),
("base16upper", 'F', "hexadecimal"),
(
"base32hex",
'v',
"rfc4648 case-insensitive - no padding - highest char",
),
(
"base32hexupper",
'V',
"rfc4648 case-insensitive - no padding - highest char",
),
(
"base32hexpad",
't',
"rfc4648 case-insensitive - with padding",
),
(
"base32hexpadupper",
'T',
"rfc4648 case-insensitive - with padding",
),
("base32", 'b', "rfc4648 case-insensitive - no padding"),
("base32upper", 'B', "rfc4648 case-insensitive - no padding"),
("base32pad", 'c', "rfc4648 case-insensitive - with padding"),
(
"base32padupper",
'C',
"rfc4648 case-insensitive - with padding",
),
("base32z", 'h', "z-base-32 (used by Tahoe-LAFS)"),
(
"base36",
'k',
"base36 [0-9a-z] case-insensitive - no padding",
),
(
"base36upper",
'K',
"base36 [0-9a-z] case-insensitive - no padding",
),
("base58btc", 'z', "base58 bitcoin"),
("base58flickr", 'Z', "base58 flicker"),
("base64", 'm', "rfc4648 no padding"),
("base64pad", 'M', "rfc4648 with padding - MIME encoding"),
("base64url", 'u', "rfc4648 no padding"),
("base64urlpad", 'U', "rfc4648 with padding"),
];
#[cfg(test)]
#[path = "multibase_test.rs"]
mod multibase_test;