use base64;
use error::Error;
fn combine_bits(buf: &[u8]) -> u64 {
let mut res = 0u64;
for i in 0..(buf.len()) {
res += (buf[buf.len() - i - 1] as u64) << (i * 8);
}
res
}
fn split_into_bits(n: u64) -> [u8; 8] {
let mut buf = [0; 8];
for i in 0..8 {
buf[i] = ((n << (i * 8)) >> (7 * 8)) as u8;
}
buf
}
fn trim(b: &[u8]) -> &[u8] {
for index in 0..(b.len()) {
if b[index] != 0 {
return &b[index..];
}
}
&[0]
}
pub fn encode_id(id: u64) -> String {
base64::encode_config(trim(&split_into_bits(id)), base64::URL_SAFE_NO_PAD)
}
pub fn decode_id(id: &str) -> Result<u64, Error> {
Ok(combine_bits(&base64::decode_config(id, base64::URL_SAFE_NO_PAD)?))
}