#[cfg(all(feature = "encoding-bech32", feature = "alloc"))]
use super::super::encoding::bech32::{BECH32_CODE_LENGTH, Bech32Sized};
#[cfg(all(feature = "encoding-bech32", feature = "alloc"))]
use crate::error::Bech32Error;
#[cfg(all(feature = "encoding-bech32", feature = "alloc"))]
use alloc::string::{String, ToString};
#[cfg(all(feature = "encoding-bech32", feature = "alloc"))]
use alloc::vec::Vec;
#[cfg(all(feature = "encoding-bech32", feature = "alloc"))]
use bech32::primitives::decode::CheckedHrpstring;
#[cfg(all(feature = "encoding-bech32", feature = "alloc"))]
pub trait FromBech32Str {
fn try_from_bech32(&self, expected_hrp: &str) -> Result<Vec<u8>, Bech32Error>;
fn try_from_bech32_unchecked(&self) -> Result<(String, Vec<u8>), Bech32Error>;
fn try_from_bech32_sized<const N: usize>(
&self,
expected_hrp: &str,
) -> Result<Vec<u8>, Bech32Error>;
fn try_from_bech32_unchecked_sized<const N: usize>(
&self,
) -> Result<(String, Vec<u8>), Bech32Error>;
}
#[cfg(all(feature = "encoding-bech32", feature = "alloc"))]
impl<T: AsRef<str> + ?Sized> FromBech32Str for T {
#[inline(always)]
fn try_from_bech32_unchecked(&self) -> Result<(String, Vec<u8>), Bech32Error> {
self.try_from_bech32_unchecked_sized::<BECH32_CODE_LENGTH>()
}
#[inline(always)]
fn try_from_bech32(&self, expected_hrp: &str) -> Result<Vec<u8>, Bech32Error> {
self.try_from_bech32_sized::<BECH32_CODE_LENGTH>(expected_hrp)
}
fn try_from_bech32_unchecked_sized<const N: usize>(
&self,
) -> Result<(String, Vec<u8>), Bech32Error> {
let s = self.as_ref();
let checked =
CheckedHrpstring::new::<Bech32Sized<N>>(s).map_err(|_| Bech32Error::OperationFailed)?;
let hrp = checked.hrp().to_string();
let data: Vec<u8> = checked.byte_iter().collect();
Ok((hrp, data))
}
fn try_from_bech32_sized<const N: usize>(
&self,
expected_hrp: &str,
) -> Result<Vec<u8>, Bech32Error> {
let s = self.as_ref();
let checked =
CheckedHrpstring::new::<Bech32Sized<N>>(s).map_err(|_| Bech32Error::OperationFailed)?;
if !checked.hrp().as_str().eq_ignore_ascii_case(expected_hrp) {
return Err(Bech32Error::UnexpectedHrp);
}
Ok(checked.byte_iter().collect())
}
}