use crate::error::CoreError;
use prost::bytes::Bytes;
pub fn decode_bech32(hrp_addr: &str) -> Result<Bytes, CoreError> {
let (_hrp, raw) =
bech32::decode(hrp_addr).map_err(|e| CoreError::InvalidBech32(e.to_string()))?;
if raw.len() != 32 {
return Err(CoreError::InvalidAddressLength(raw.len()));
}
Ok(Bytes::from(raw))
}
pub fn decode_optional_bech32(addr: Option<&str>) -> Result<Bytes, CoreError> {
match addr {
Some(a) if !a.trim().is_empty() => decode_bech32(a),
_ => Ok(Bytes::new()),
}
}
pub fn encode_bech32(hrp: &str, data: &[u8]) -> Result<String, CoreError> {
bech32::encode::<bech32::Bech32>(
bech32::Hrp::parse(hrp).map_err(|e| CoreError::InvalidHrp(e.to_string()))?,
data,
)
.map_err(|e| CoreError::Bech32Encode(e.to_string()))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_decode_bech32() {
let addr = "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th";
let result = decode_bech32(addr);
assert!(result.is_ok());
assert_eq!(result.unwrap().len(), 32);
}
#[test]
fn test_decode_bech32_invalid() {
let result = decode_bech32("invalid");
assert!(result.is_err());
}
#[test]
fn test_encode_decode_roundtrip() {
let original = "erd1qyu5wthldzr8wx5c9ucg8kjagg0jfs53s8nr3zpz3hypefsdd8ssycr6th";
let decoded = decode_bech32(original).unwrap();
let encoded = encode_bech32("erd", &decoded).unwrap();
assert_eq!(original, encoded);
}
#[test]
fn test_decode_optional_bech32_none() {
let result = decode_optional_bech32(None);
assert!(result.is_ok());
assert!(result.unwrap().is_empty());
}
#[test]
fn test_decode_optional_bech32_empty() {
let result = decode_optional_bech32(Some(""));
assert!(result.is_ok());
assert!(result.unwrap().is_empty());
}
}