Nice article though some of the code is less elegant than it could be, normally you would match the option to unwrap it and then match it's value, instead of doing a lot of 'Some( .. )' matches.
let first_character = match line.chars().next() {
Some( v ) => v,
None => return
}
match first_character {
'# => println!("Comment"),
...
}