1extern crate regex;
2
3mod links;
4mod hashtags;
5
6#[derive(Debug)]
7pub struct MessageMeta {
8 pub message: String,
9 pub links: Vec<links::Link>,
10 pub hashtags: Vec<hashtags::Hashtag>,
11}
12
13pub fn parse<T: ToString>(msg: T) -> MessageMeta {
14 let message = msg.to_string();
15 let links = links::parse(message.clone());
16 let hashtags = hashtags::parse(message.clone());
17
18 MessageMeta { message, links, hashtags }
19}
20
21#[cfg(test)]
22mod tests {
23 use super::parse;
24
25 #[test]
26 fn should_parse_message_without_meta() {
27 let meta = parse("test message");
28
29 assert_eq!(meta.message, "test message");
30 assert_eq!(meta.links.len(), 0);
31 }
32
33 #[test]
34 fn should_parse_with_all_features() {
35 let meta = parse("test message https://google.com/ #hashtag test");
36
37 assert_eq!(meta.message, "test message https://google.com/ #hashtag test");
38 assert_eq!(meta.links.len(), 1);
39 assert_eq!(meta.links[0].url, "https://google.com/");
40 assert_eq!(meta.hashtags.len(), 1);
41 assert_eq!(meta.hashtags[0].name, "#hashtag");
42 }
43}