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
#[cfg_attr(test, derive(PartialEq))] #[derive(Debug)] pub struct Rule; impl Rule { pub fn parse(src: &str) -> usize { let end = memchr::memchr(b'\n', src.as_bytes()) .map(|i| i + 1) .unwrap_or_else(|| src.len()); let rules = &src[0..end].trim(); if rules.len() >= 5 && rules.chars().all(|c| c == '-') { end } else { 0 } } } #[test] fn parse() { assert_eq!(Rule::parse("-----"), "-----".len()); assert_eq!(Rule::parse("--------"), "--------".len()); assert_eq!(Rule::parse(" -----"), " -----".len()); assert_eq!(Rule::parse("\t\t-----"), "\t\t-----".len()); assert_eq!(Rule::parse("\t\t-----\n"), "\t\t-----\n".len()); assert_eq!(Rule::parse("\t\t----- \n"), "\t\t----- \n".len()); assert_eq!(Rule::parse(""), 0); assert_eq!(Rule::parse("----"), 0); assert_eq!(Rule::parse(" ----"), 0); assert_eq!(Rule::parse(" 0----"), 0); assert_eq!(Rule::parse("0 ----"), 0); assert_eq!(Rule::parse("0------"), 0); assert_eq!(Rule::parse("----0----"), 0); assert_eq!(Rule::parse("\t\t----"), 0); assert_eq!(Rule::parse("------0"), 0); assert_eq!(Rule::parse("----- 0"), 0); }