|  | extern crate nom; | 
|  |  | 
|  | use nom::{ | 
|  | IResult, | 
|  | multi::many0, | 
|  | sequence::terminated, | 
|  | character::complete::{alphanumeric1 as alphanumeric, line_ending as eol} | 
|  | }; | 
|  |  | 
|  | pub fn end_of_line(input: &str) -> IResult<&str, &str> { | 
|  | if input.is_empty() { | 
|  | Ok((input, input)) | 
|  | } else { | 
|  | eol(input) | 
|  | } | 
|  | } | 
|  |  | 
|  | pub fn read_line(input: &str) -> IResult<&str, &str> { | 
|  | terminated(alphanumeric, end_of_line)(input) | 
|  | } | 
|  |  | 
|  | pub fn read_lines(input: &str) -> IResult<&str, Vec<&str>> { | 
|  | many0(read_line)(input) | 
|  | } | 
|  |  | 
|  | #[cfg(feature = "alloc")] | 
|  | #[test] | 
|  | fn read_lines_test() { | 
|  | let res = Ok(( | 
|  | "", | 
|  | vec!["Duck", "Dog", "Cow"], | 
|  | )); | 
|  |  | 
|  | assert_eq!(read_lines("Duck\nDog\nCow\n"), res); | 
|  | assert_eq!(read_lines("Duck\nDog\nCow"), res); | 
|  | } |