diff --git a/src/marko.rs b/src/marko.rs index 88dc3786ee0f50d6d0362a1b3fd6153aeba187e4..da927e4723acccbb2ec05ad572380be83102fb78 100644 --- a/src/marko.rs +++ b/src/marko.rs @@ -151,7 +151,6 @@ pub fn parse_open(src: &str) -> Result { } // in any order: parameters, arguments, variable - // TODO: create errors when things repeat let mut has_js_arguments = false; let mut has_js_params = false; let mut has_js_variable = false; @@ -182,13 +181,31 @@ pub fn parse_open(src: &str) -> Result { has_js_params = true; } b'(' => { - // arguments if has_js_arguments { return Err(err("Function call already specified", offset, 1)); } - // TODO: METHOD SHORTHAND - println!("{}", l.peek_rest()); - parse_call_arguments(&mut l)?; + + let start_offset = l.offset; + if parse_call_arguments(&mut l).is_ok() { + let after_call = l.peek_rest().trim_start(); + if after_call.starts_with('{') { + l.offset = start_offset; + l.skip_whitespace(); + if l.peek_byte() == Some(b'=') { + l.offset += 1; + l.skip_whitespace(); + } + parse_fn_params_and_body(&mut l)?; + } + } else { + l.offset = start_offset; + l.skip_whitespace(); + if l.peek_byte() == Some(b'=') { + l.offset += 1; + l.skip_whitespace(); + } + parse_fn_params_and_body(&mut l)?; + } l.skip_whitespace(); has_js_arguments = true; } @@ -1081,6 +1098,42 @@ mod tests { ); } + #[test] + fn test_value_method_shorthand() { + assert_eq!( + parse_open(""), + Ok(Open { + tag_name: "my-tag", + content: "", + self_closing: false, + }) + ); + } + + #[test] + fn test_value_method_shorthand_self_closing() { + assert_eq!( + parse_open(""), + Ok(Open { + tag_name: "my-tag", + content: "", + self_closing: true, + }) + ); + } + + #[test] + fn test_value_method_shorthand_with_param() { + assert_eq!( + parse_open(""), + Ok(Open { + tag_name: "my-tag", + content: "", + self_closing: false, + }) + ); + } + #[test] fn test_combined_variable_and_args() { assert_eq!(