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
extern crate regex; mod links; mod hashtags; #[derive(Debug)] pub struct MessageMeta { pub message: String, pub links: Vec<links::Link>, pub hashtags: Vec<hashtags::Hashtag>, } pub fn parse<T: ToString>(msg: T) -> MessageMeta { let message = msg.to_string(); let links = links::parse(message.clone()); let hashtags = hashtags::parse(message.clone()); MessageMeta { message, links, hashtags } } #[cfg(test)] mod tests { use super::parse; #[test] fn should_parse_message_without_meta() { let meta = parse("test message"); assert_eq!(meta.message, "test message"); assert_eq!(meta.links.len(), 0); } #[test] fn should_parse_with_all_features() { let meta = parse("test message https://google.com/ #hashtag test"); assert_eq!(meta.message, "test message https://google.com/ #hashtag test"); assert_eq!(meta.links.len(), 1); assert_eq!(meta.links[0].url, "https://google.com/"); assert_eq!(meta.hashtags.len(), 1); assert_eq!(meta.hashtags[0].name, "#hashtag"); } }