base_d/wordlists/
mod.rs

1//! Built-in word lists for word-based encoding.
2//!
3//! Currently includes:
4//! - BIP-39 English (2048 words)
5
6use crate::core::word_dictionary::WordDictionary;
7
8/// The BIP-39 English word list (2048 words).
9///
10/// Used for cryptocurrency seed phrases. Each word encodes 11 bits.
11pub const BIP39_ENGLISH: &str = include_str!("bip39-english.txt");
12
13/// Creates a WordDictionary from the built-in BIP-39 English word list.
14///
15/// # Example
16///
17/// ```
18/// use base_d::wordlists::bip39_english;
19/// use base_d::word;
20///
21/// let dict = bip39_english();
22/// assert_eq!(dict.base(), 2048);
23///
24/// let encoded = word::encode(b"hello", &dict);
25/// let decoded = word::decode(&encoded, &dict).unwrap();
26/// assert_eq!(decoded, b"hello");
27/// ```
28pub fn bip39_english() -> WordDictionary {
29    WordDictionary::builder()
30        .words_from_str(BIP39_ENGLISH)
31        .delimiter(" ")
32        .case_sensitive(false)
33        .build()
34        .expect("BIP-39 English word list should be valid")
35}
36
37#[cfg(test)]
38mod tests {
39    use super::*;
40
41    #[test]
42    fn test_bip39_english_word_count() {
43        let dict = bip39_english();
44        assert_eq!(dict.base(), 2048);
45    }
46
47    #[test]
48    fn test_bip39_english_first_word() {
49        let dict = bip39_english();
50        assert_eq!(dict.encode_word(0), Some("abandon"));
51    }
52
53    #[test]
54    fn test_bip39_english_last_word() {
55        let dict = bip39_english();
56        assert_eq!(dict.encode_word(2047), Some("zoo"));
57    }
58
59    #[test]
60    fn test_bip39_english_roundtrip() {
61        use crate::encoders::algorithms::word;
62
63        let dict = bip39_english();
64        let data = b"The quick brown fox jumps over the lazy dog";
65        let encoded = word::encode(data, &dict);
66        let decoded = word::decode(&encoded, &dict).unwrap();
67        assert_eq!(decoded, data);
68    }
69
70    #[test]
71    fn test_bip39_english_case_insensitive() {
72        let dict = bip39_english();
73        assert_eq!(dict.decode_word("abandon"), Some(0));
74        assert_eq!(dict.decode_word("ABANDON"), Some(0));
75        assert_eq!(dict.decode_word("Abandon"), Some(0));
76    }
77}