message_meta/
lib.rs

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}