Add words and deprecate word_iter method

To follow the convention for Rust iterators, for example, in `str`
the method for a char iterator is `chars` not `char_iter`.

Signed-off-by: Jean-Pierre De Jesus DIAZ <me@jeandudey.tech>
This commit is contained in:
Jean-Pierre De Jesus DIAZ 2023-03-13 11:51:29 +01:00
parent aa6609ac2b
commit 73f0c112aa
No known key found for this signature in database
GPG Key ID: 6279AEC20A9524EC
1 changed files with 26 additions and 7 deletions

View File

@ -309,12 +309,31 @@ impl Mnemonic {
self.lang
}
/// Get an iterator over the words.
pub fn word_iter(&self) -> impl Iterator<Item = &'static str> + Clone + '_ {
/// Returns an iterator over the words of the [`Mnemonic`].
///
/// # Examples
///
/// Basic usage:
///
/// ```
/// use bip39::Mnemonic;
///
/// let mnemonic = Mnemonic::from_entropy(&[0; 32]).unwrap();
/// for (i, word) in mnemonic.words().enumerate() {
/// println!("{}. {}", i, word);
/// }
/// ```
pub fn words(&self) -> impl Iterator<Item = &'static str> + Clone + '_ {
let list = self.lang.word_list();
self.words.iter().take_while(|w| **w != EOF).map(move |w| list[*w as usize])
}
/// Returns an iterator over the words of the [`Mnemonic`].
#[deprecated(note = "Use Mnemonic::words instead")]
pub fn word_iter(&self) -> impl Iterator<Item = &'static str> + Clone + '_ {
self.words()
}
/// Determine the language of the mnemonic as a word iterator.
/// See documentation on [Mnemonic::language_of] for more info.
fn language_of_iter<'a, W: Iterator<Item = &'a str>>(words: W) -> Result<Language, Error> {
@ -505,7 +524,7 @@ impl Mnemonic {
let mut seed = [0u8; PBKDF2_BYTES];
pbkdf2::pbkdf2(
self.word_iter(),
self.words(),
normalized_passphrase.as_bytes(),
PBKDF2_ROUNDS,
&mut seed,
@ -531,7 +550,7 @@ impl Mnemonic {
// We unwrap errors here because this method can only be called on
// values that were already previously validated.
let language = Mnemonic::language_of_iter(self.word_iter()).unwrap();
let language = Mnemonic::language_of_iter(self.words()).unwrap();
// Preallocate enough space for the longest possible word list
let mut entropy = [0; 33];
@ -540,7 +559,7 @@ impl Mnemonic {
let mut remainder = 0;
let nb_words = self.word_count();
for word in self.word_iter() {
for word in self.words() {
let idx = language.find_word(word).expect("invalid mnemonic");
remainder |= ((idx as u32) << (32 - 11)) >> offset;
@ -572,7 +591,7 @@ impl Mnemonic {
impl fmt::Display for Mnemonic {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
for (i, word) in self.word_iter().enumerate() {
for (i, word) in self.words().enumerate() {
if i > 0 {
f.write_str(" ")?;
}
@ -612,7 +631,7 @@ mod tests {
fn test_language_of() {
for lang in Language::all() {
let m = Mnemonic::generate_in(*lang, 24).unwrap();
assert_eq!(*lang, Mnemonic::language_of_iter(m.word_iter()).unwrap());
assert_eq!(*lang, Mnemonic::language_of_iter(m.words()).unwrap());
assert_eq!(
*lang,
Mnemonic::language_of_iter(m.to_string().split_whitespace()).unwrap()