use bech32::{convert_bits, decode, encode, CheckBase32, Error, Variant};
use cosmwasm_std::Addr;
const PREFIX: &str = "stars";
trait ToStars {
fn to_stars(&self) -> Result<String, Error>;
}
impl ToStars for String {
fn to_stars(&self) -> Result<String, Error> {
let decoded = decode_and_convert(self)?;
convert_and_encode(PREFIX.to_string(), decoded.1)
}
}
impl ToStars for str {
fn to_stars(&self) -> Result<String, Error> {
let decoded = decode_and_convert(self)?;
convert_and_encode(PREFIX.to_string(), decoded.1)
}
}
impl ToStars for Addr {
fn to_stars(&self) -> Result<String, Error> {
let decoded = decode_and_convert(self.as_ref())?;
convert_and_encode(PREFIX.to_string(), decoded.1)
}
}
pub fn decode_and_convert(bech: &str) -> Result<(String, Vec<u8>), Error> {
let decoded = decode(bech)?;
let hrp = decoded.0;
let data = decoded.1;
let converted = convert_bits(&data, 5, 8, false)?;
Ok((hrp, converted))
}
pub fn convert_and_encode(hrp: String, data: Vec<u8>) -> Result<String, Error> {
let converted = convert_bits(&data, 8, 5, true)?;
encode(&hrp, converted.check_base32()?, Variant::Bech32)
}
#[cfg(test)]
mod tests {
use crate::bech32_convert::{convert_and_encode, decode_and_convert, ToStars};
use cosmwasm_std::Addr;
#[test]
fn decode_encode() {
let decoded = decode_and_convert("cosmos1ey69r37gfxvxg62sh4r0ktpuc46pzjrmz29g45").unwrap();
let addr = convert_and_encode("stars".to_string(), decoded.1).unwrap();
assert_eq!(
addr,
"stars1ey69r37gfxvxg62sh4r0ktpuc46pzjrmkkj479".to_string()
);
}
#[test]
fn string_to_stars() {
let addr = "cosmos1ey69r37gfxvxg62sh4r0ktpuc46pzjrmz29g45"
.to_string()
.to_stars()
.unwrap();
assert_eq!(
addr,
"stars1ey69r37gfxvxg62sh4r0ktpuc46pzjrmkkj479".to_string()
);
}
#[test]
fn str_to_stars() {
let addr = "cosmos1ey69r37gfxvxg62sh4r0ktpuc46pzjrmz29g45"
.to_stars()
.unwrap();
assert_eq!(
addr,
"stars1ey69r37gfxvxg62sh4r0ktpuc46pzjrmkkj479".to_string()
);
}
#[test]
fn addr_to_stars() {
let addr = Addr::unchecked("cosmos1ey69r37gfxvxg62sh4r0ktpuc46pzjrmz29g45")
.to_stars()
.unwrap();
assert_eq!(
addr,
"stars1ey69r37gfxvxg62sh4r0ktpuc46pzjrmkkj479".to_string()
);
}
}