use crate::{encoding::Encoding, error::Error};
use secrecy::{Secret, SecretString, SecretVec};
use subtle_encoding::bech32::{self, Bech32};
pub(crate) struct Parts {
pub(crate) prefix: String,
pub(crate) data: SecretVec<u8>,
pub(crate) fragment: Option<SecretString>,
}
impl Parts {
pub(crate) fn decode(uri: &str, encoding: &Encoding) -> Result<Self, Error> {
if let Some(delimiter) = encoding.fragment_delimiter {
if let Some(pos) = uri.find(delimiter) {
let fragment = uri[(pos + 1)..].to_owned();
let (prefix, data) =
Bech32::new(bech32::DEFAULT_CHARSET, encoding.delimiter).decode(&uri[..pos])?;
return Ok(Self {
prefix,
data: Secret::new(data),
fragment: Some(Secret::new(fragment)),
});
}
}
let (prefix, data) =
Bech32::new(bech32::DEFAULT_CHARSET, encoding.delimiter).decode(uri)?;
Ok(Self {
prefix,
data: Secret::new(data),
fragment: None,
})
}
}