1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
#[derive(Debug)] pub struct DictEntry<'a> { pub traditional: &'a str, pub simplified: &'a str, pub pinyin: &'a str, pub definitions: Vec<&'a str> } pub fn parse_line(line: &str) -> Result<DictEntry, ()> { let line = line.trim(); let (traditional, line) = { let mut parts = line.splitn(2, " "); ( parts.next().ok_or(())?, parts.next().ok_or(())? ) }; let (simplified, line) = { let mut parts = line.splitn(2, " "); ( parts.next().ok_or(())?, parts.next().ok_or(())? ) }; let (pinyin, line) = { let pinyin_begin = line.find('[').ok_or(())? + 1; let pinyin_end = line.find(']').ok_or(())?; ( &line[pinyin_begin..pinyin_end], &line[pinyin_end+1..] ) }; let definitions = { let mut defs = Vec::new(); let mut line = line.trim(); while !line.is_empty() { let def_end = line.find('/').ok_or(())?; if !line[..def_end].is_empty() { defs.push(&line[..def_end]); } line = &line[def_end + 1..] } defs }; Ok(DictEntry { traditional: traditional, simplified: simplified, pinyin: pinyin, definitions: definitions }) } #[test] fn test_parse_pinyin() { let line = "你好 你好 [ni3 hao3] /Hello!/Hi!/How are you?/"; let parsed = parse_line(line).unwrap(); assert_eq!(parsed.pinyin, "ni3 hao3"); } #[test] fn test_parse_simplified() { let line = "你好 你好 [ni3 hao3] /Hello!/Hi!/How are you?/"; let parsed = parse_line(line).unwrap(); assert_eq!(parsed.simplified, "你好"); } #[test] fn test_parse_traditional() { let line = "愛 爱 [ai4] /to love/to be fond of/to like/"; let parsed = parse_line(line).unwrap(); assert_eq!(parsed.traditional, "愛"); assert_eq!(parsed.simplified, "爱"); }