Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add CheckedHrpstring::fe32_iter function #174

Merged
merged 2 commits into from
Jan 23, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 15 additions & 13 deletions src/primitives/decode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,14 @@ impl<'s> CheckedHrpstring<'s> {
#[inline]
pub fn data_part_ascii_no_checksum(&self) -> &[u8] { self.ascii }

/// Returns an iterator that yields the data part of the parsed bech32 encoded string as [`Fe32`]s.
///
/// Converts the ASCII bytes representing field elements to the respective field elements.
#[inline]
pub fn fe32_iter<I: Iterator<Item = u8>>(&self) -> AsciiToFe32Iter {
AsciiToFe32Iter { iter: self.ascii.iter().copied() }
}

/// Returns an iterator that yields the data part of the parsed bech32 encoded string.
///
/// Converts the ASCII bytes representing field elements to the respective field elements, then
Expand Down Expand Up @@ -629,7 +637,7 @@ fn check_characters(s: &str) -> Result<usize, CharError> {

/// An iterator over a parsed HRP string data as bytes.
pub struct ByteIter<'s> {
iter: FesToBytes<AsciiToFe32Iter<iter::Copied<slice::Iter<'s, u8>>>>,
iter: FesToBytes<AsciiToFe32Iter<'s>>,
}

impl<'s> Iterator for ByteIter<'s> {
Expand All @@ -647,7 +655,7 @@ impl<'s> ExactSizeIterator for ByteIter<'s> {

/// An iterator over a parsed HRP string data as field elements.
pub struct Fe32Iter<'s> {
iter: AsciiToFe32Iter<iter::Copied<slice::Iter<'s, u8>>>,
iter: AsciiToFe32Iter<'s>,
}

impl<'s> Iterator for Fe32Iter<'s> {
Expand All @@ -658,21 +666,18 @@ impl<'s> Iterator for Fe32Iter<'s> {
fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
}

/// Helper iterator adaptor that maps an iterator of valid bech32 character ASCII bytes to an
/// Iterator adaptor that maps an iterator of valid bech32 character ASCII bytes to an
/// iterator of field elements.
///
/// # Panics
///
/// If any `u8` in the input iterator is out of range for an [`Fe32`]. Should only be used on data
/// that has already been checked for validity (eg, by using `check_characters`).
struct AsciiToFe32Iter<I: Iterator<Item = u8>> {
iter: I,
pub struct AsciiToFe32Iter<'s> {
iter: iter::Copied<slice::Iter<'s, u8>>,
}

impl<I> Iterator for AsciiToFe32Iter<I>
where
I: Iterator<Item = u8>,
{
impl<'s> Iterator for AsciiToFe32Iter<'s> {
type Item = Fe32;
#[inline]
fn next(&mut self) -> Option<Fe32> { self.iter.next().map(Fe32::from_char_unchecked) }
Expand All @@ -683,10 +688,7 @@ where
}
}

impl<I> ExactSizeIterator for AsciiToFe32Iter<I>
where
I: Iterator<Item = u8> + ExactSizeIterator,
{
impl<'s> ExactSizeIterator for AsciiToFe32Iter<'s> {
#[inline]
fn len(&self) -> usize { self.iter.len() }
}
Expand Down
Loading