diff options
Diffstat (limited to 'src/parser.rs')
-rw-r--r-- | src/parser.rs | 48 |
1 files changed, 33 insertions, 15 deletions
diff --git a/src/parser.rs b/src/parser.rs index 662ffd0..d283d90 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1,9 +1,7 @@ -use crate::directive::Directive; use crate::error::SiteError; use crate::token::{Token, TokenParser, TokenPatterns}; use crate::wikitext::{ParsedDirective, Snippet, WikiLink}; use std::collections::HashMap; -use std::convert::TryFrom; #[derive(Debug)] pub struct WikitextParser { @@ -102,8 +100,7 @@ impl WikitextParser { _ => panic!("yikes: {:?}", self.tokens), } } - let p = ParsedDirective::new(&name, args)?; - Snippet::Directive(Directive::try_from(p)?) + Snippet::Directive(ParsedDirective::new(&name, args)?) } [Token::Bang, Token::OpenBracket, ..] => { let mut link_text = String::new(); @@ -200,8 +197,16 @@ impl WikitextParser { #[cfg(test)] mod test { - use super::{Directive, Snippet, TokenPatterns, WikiLink, WikitextParser}; - use crate::directive::Img; + use super::{ParsedDirective, Snippet, TokenPatterns, WikiLink, WikitextParser}; + use std::collections::HashMap; + + fn parsed_directive(name: &str, kv: &[(&str, &str)]) -> ParsedDirective { + ParsedDirective::new( + name, + HashMap::from_iter(kv.iter().map(|(k, v)| (k.to_string(), v.to_string()))), + ) + .unwrap() + } #[test] fn empty_input() { @@ -285,7 +290,7 @@ mod test { let mut p = WikitextParser::new("[[!simple]]", &patterns); assert_eq!( p.parse().unwrap(), - Some(Snippet::Directive(Directive::Simple)) + Some(Snippet::Directive(parsed_directive("simple", &[]))) ); assert_eq!(p.parse().unwrap(), None); } @@ -296,7 +301,10 @@ mod test { let mut p = WikitextParser::new("[[!unnamedarg foo.jpg]]", &patterns); assert_eq!( p.parse().unwrap(), - Some(Snippet::Directive(Directive::UnnamedArg)) + Some(Snippet::Directive(parsed_directive( + "unnamedarg", + &[("foo.jpg", "")] + ))) ); assert_eq!(p.parse().unwrap(), None); } @@ -307,7 +315,10 @@ mod test { let mut p = WikitextParser::new("[[!simplearg foo=bar]]", &patterns); assert_eq!( p.parse().unwrap(), - Some(Snippet::Directive(Directive::SimpleArg)) + Some(Snippet::Directive(parsed_directive( + "simplearg", + &[("foo", "bar")] + ))) ); assert_eq!(p.parse().unwrap(), None); } @@ -318,7 +329,10 @@ mod test { let mut p = WikitextParser::new(r#"[[!quotedarg bar="foobar"]]"#, &patterns); assert_eq!( p.parse().unwrap(), - Some(Snippet::Directive(Directive::QuotedArg)) + Some(Snippet::Directive(parsed_directive( + "quotedarg", + &[("bar", "foobar")] + ))) ); assert_eq!(p.parse().unwrap(), None); } @@ -328,12 +342,15 @@ mod test { let patterns = TokenPatterns::default(); let mut p = WikitextParser::new( r#"[[!multilinearg yo="""foo - bar"""]]"#, +bar"""]]"#, &patterns, ); assert_eq!( p.parse().unwrap(), - Some(Snippet::Directive(Directive::MultilineArg)) + Some(Snippet::Directive(parsed_directive( + "multilinearg", + &[("yo", "foo\nbar")] + ))) ); assert_eq!(p.parse().unwrap(), None); } @@ -344,9 +361,10 @@ mod test { let mut p = WikitextParser::new(r#"[[!img foo.jpg class=image]]"#, &patterns); assert_eq!( p.parse().unwrap(), - Some(Snippet::Directive(Directive::Img(Img::new( - "foo.jpg".into() - )))) + Some(Snippet::Directive(parsed_directive( + "img", + &[("foo.jpg", ""), ("class", "image")] + ))) ); assert_eq!(p.parse().unwrap(), None); } |