mod markdown {
    use pulldown_cmark::Parser;
    use pulldown_cmark::Event;
    use pulldown_cmark::Tag;

    pub struct MarkdownParser<'a> {
        text: &'a String
    }

    impl<'a> MarkdownParser<'a> {

        pub fn new(s: &'a String) -> MarkdownParser {
            MarkdownParser {
                text: s
            }
        }

        pub fn links(&self) -> Vec<String> {
            Parser::new(&self.text[..])
                .filter_map(|e| {
                    match e {
                        Event::Start(t) => Some(t),
                        Event::End(t)   => Some(t),
                        _               => None
                    }
                })
                .filter_map(|tag| {
                    match tag {
                        Tag::Link(url, text) => Some((url, text)),
                        _               => None
                    }
                })
                .map(|(url, text)| {
                    text.into_owned()
                }).collect::<Vec<String>>()
        }

        pub fn codeblocks(&self) -> Vec<String> {
            Parser::new(&self.text[..])
                .filter_map(|e| {
                    match e {
                        Event::Start(t) => Some(t),
                        Event::End(t)   => Some(t),
                        _               => None
                    }
                })
                .filter_map(|tag| {
                    match tag {
                        Tag::CodeBlock(text)    => Some(text),
                        _                       => None
                    }
                })
                .map(|text| {
                    text.into_owned()
                }).collect::<Vec<String>>()
        }

    }

}


pub fn extract_links(s: &String) -> Vec<String> {
    use pulldown_cmark::Parser;
    use pulldown_cmark::Event;
    use pulldown_cmark::Tag;

    Parser::new(&s[..])
        .filter_map(|e| {
            match e {
                Event::Start(t) => Some(t),
                Event::End(t)   => Some(t),
                _               => None
            }
        })
        .filter_map(|tag| {
            match tag {
                Tag::Link(url, text) => Some((url, text)),
                _               => None
            }
        })
        .map(|(url, text)| {
            text.into_owned()
        }).collect::<Vec<String>>()
}


--- 
+++ 
@@ -1,25 +1,60 @@
-
-pub fn extract_links(s: &String) -> Vec<String> {
+mod markdown {
     use pulldown_cmark::Parser;
     use pulldown_cmark::Event;
     use pulldown_cmark::Tag;
 
-    Parser::new(&s[..])
-        .filter_map(|e| {
-            match e {
-                Event::Start(t) => Some(t),
-                Event::End(t)   => Some(t),
-                _               => None
+    pub struct MarkdownParser<'a> {
+        text: &'a String
+    }
+
+    impl<'a> MarkdownParser<'a> {
+
+        pub fn new(s: &'a String) -> MarkdownParser {
+            MarkdownParser {
+                text: s
             }
-        })
-        .filter_map(|tag| {
-            match tag {
-                Tag::Link(url, text) => Some((url, text)),
-                _               => None
-            }
-        })
-        .map(|(url, text)| {
-            text.into_owned()
-        }).collect::<Vec<String>>()
+        }
+
+        pub fn links(&self) -> Vec<String> {
+            Parser::new(&self.text[..])
+                .filter_map(|e| {
+                    match e {
+                        Event::Start(t) => Some(t),
+                        Event::End(t)   => Some(t),
+                        _               => None
+                    }
+                })
+                .filter_map(|tag| {
+                    match tag {
+                        Tag::Link(url, text) => Some((url, text)),
+                        _               => None
+                    }
+                })
+                .map(|(url, text)| {
+                    text.into_owned()
+                }).collect::<Vec<String>>()
+        }
+
+        pub fn codeblocks(&self) -> Vec<String> {
+            Parser::new(&self.text[..])
+                .filter_map(|e| {
+                    match e {
+                        Event::Start(t) => Some(t),
+                        Event::End(t)   => Some(t),
+                        _               => None
+                    }
+                })
+                .filter_map(|tag| {
+                    match tag {
+                        Tag::CodeBlock(text)    => Some(text),
+                        _                       => None
+                    }
+                })
+                .map(|text| {
+                    text.into_owned()
+                }).collect::<Vec<String>>()
+        }
+
+    }
+
 }
-
Rewrite markdown parsing, so we can extract links and quotes (and maybe more)
