Add word information to Error::UnknownWord

This commit is contained in:
Steven Roose 2021-03-08 11:05:41 +00:00
parent 7836707810
commit 116b508cd3
No known key found for this signature in database
GPG Key ID: 2F2A88D7F8D68E87
1 changed files with 18 additions and 9 deletions

View File

@ -93,7 +93,9 @@ pub enum Error {
/// Mnemonic has a word count that is not a multiple of 6.
BadWordCount(usize),
/// Mnemonic contains an unknown word.
UnknownWord, //TODO(stevenroose) add back word info
/// Error contains the index of the word.
/// Use `mnemonic.split_whitespace().get(i)` to get the word.
UnknownWord(usize),
/// Entropy was not a multiple of 32 bits or between 128-256n bits in length.
BadEntropyBitCount(usize),
/// The mnemonic has an invalid checksum.
@ -111,8 +113,8 @@ impl fmt::Display for Error {
Error::BadWordCount(c) => write!(f,
"mnemonic has a word count that is not a multiple of 6: {}", c,
),
Error::UnknownWord => write!(f,
"mnemonic contains an unknown word",
Error::UnknownWord(i) => write!(f,
"mnemonic contains an unknown word (word {})", i,
),
Error::BadEntropyBitCount(c) => write!(f,
"entropy was not between 128-256 bits or not a multiple of 32 bits: {} bits", c,
@ -245,7 +247,7 @@ impl Mnemonic {
return if lang.find_word(first_word).is_some() {
Ok(lang)
} else {
Err(Error::UnknownWord)//TODO(stevenroose) (first_word.to_owned()))
Err(Error::UnknownWord(0))
};
}
@ -266,7 +268,7 @@ impl Mnemonic {
// Those were considered above.
possible[i] = !lang.unique_words();
}
for word in words {
for (idx, word) in words.enumerate() {
// Scrap languages that don't have this word.
for (i, lang) in langs.iter().enumerate() {
if possible[i] {
@ -282,7 +284,7 @@ impl Mnemonic {
// If all languages were eliminated, it's an invalid word.
if nb_possible == 0 {
return Err(Error::UnknownWord);//TODO(stevenroose) (word.to_owned()))
return Err(Error::UnknownWord(idx));
}
}
@ -306,7 +308,7 @@ impl Mnemonic {
/// Parse a mnemonic in normalized UTF8 in the given language.
pub fn parse_in_normalized(language: Language, s: &str) -> Result<Mnemonic, Error> {
let nb_words = s.split_whitespace().count();
if nb_words < 6 || nb_words % 6 != 0 || nb_words > MAX_NB_WORDS {
if nb_words < MIN_NB_WORDS || nb_words % 6 != 0 || nb_words > MAX_NB_WORDS {
return Err(Error::BadWordCount(nb_words));
}
@ -318,7 +320,7 @@ impl Mnemonic {
let mut bits = [false; MAX_NB_WORDS * 11];
for (i, word) in s.split_whitespace().enumerate() {
let idx = language.find_word(word).ok_or(Error::UnknownWord)?;
let idx = language.find_word(word).ok_or(Error::UnknownWord(i))?;
words[i] = language.word_list()[idx];
@ -680,7 +682,14 @@ mod tests {
Mnemonic::parse_normalized(
"getter advice cage absurd amount doctor acoustic avoid letter advice cage above",
),
Err(Error::UnknownWord)//("getter".to_owned()))
Err(Error::UnknownWord(0))
);
assert_eq!(
Mnemonic::parse_normalized(
"letter advice cagex absurd amount doctor acoustic avoid letter advice cage above",
),
Err(Error::UnknownWord(2))
);
assert_eq!(