use std::error::Error;
use std::fmt;
use crate::base_n::{BaseNDecodeError, decode_base_n, encode_base_n};
const BASE62_ALPHABET: &[u8] = b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum Base62DecodeError {
InvalidCharacter {
index: usize,
byte: u8,
},
}
impl fmt::Display for Base62DecodeError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::InvalidCharacter { index, byte } => {
write!(
f,
"base62 input contains invalid byte 0x{byte:02x} at position {index}"
)
}
}
}
}
impl Error for Base62DecodeError {}
impl From<BaseNDecodeError> for Base62DecodeError {
fn from(error: BaseNDecodeError) -> Self {
match error {
BaseNDecodeError::InvalidCharacter { index, byte } => {
Self::InvalidCharacter { index, byte }
}
}
}
}
#[must_use]
pub fn encode_base62(bytes: impl AsRef<[u8]>) -> String {
encode_base_n(bytes.as_ref(), BASE62_ALPHABET)
}
pub fn decode_base62(encoded: impl AsRef<str>) -> Result<Vec<u8>, Base62DecodeError> {
decode_base_n(encoded.as_ref(), BASE62_ALPHABET).map_err(Into::into)
}