diff --git a/src/context/mod.rs b/src/context/mod.rs index 20dfed2e..321eb37c 100644 --- a/src/context/mod.rs +++ b/src/context/mod.rs @@ -30,4 +30,5 @@ pub use global_settings::GlobalSettings; pub use global_settings::HeadlineLevelFilter; pub use global_settings::DEFAULT_TAB_WIDTH; pub(crate) use list::List; +pub(crate) use parser_with_context::bind_context; pub(crate) use parser_with_context::parser_with_context; diff --git a/src/context/parser_with_context.rs b/src/context/parser_with_context.rs index 6705d477..17267079 100644 --- a/src/context/parser_with_context.rs +++ b/src/context/parser_with_context.rs @@ -4,3 +4,10 @@ macro_rules! parser_with_context { }; } pub(crate) use parser_with_context; + +macro_rules! bind_context { + ($target:expr, $context:expr) => { + move |i| $target($context, i) + }; +} +pub(crate) use bind_context; diff --git a/src/parser/plain_list.rs b/src/parser/plain_list.rs index 0025eeb8..dcf65e70 100644 --- a/src/parser/plain_list.rs +++ b/src/parser/plain_list.rs @@ -552,6 +552,7 @@ fn detect_contentless_item_contents<'b, 'g, 'r, 's>( #[cfg(test)] mod tests { use super::*; + use crate::context::bind_context; use crate::context::Context; use crate::context::GlobalSettings; use crate::context::List; @@ -563,7 +564,7 @@ mod tests { let global_settings = GlobalSettings::default(); let initial_context = ContextElement::document_context(); let initial_context = Context::new(&global_settings, List::new(&initial_context)); - let plain_list_item_matcher = parser_with_context!(plain_list_item)(&initial_context); + let plain_list_item_matcher = bind_context!(plain_list_item, &initial_context); let (remaining, (_, result)) = plain_list_item_matcher(input).unwrap(); assert_eq!(Into::<&str>::into(remaining), ""); assert_eq!(result.get_standard_properties().get_source(), "1."); @@ -575,7 +576,7 @@ mod tests { let global_settings = GlobalSettings::default(); let initial_context = ContextElement::document_context(); let initial_context = Context::new(&global_settings, List::new(&initial_context)); - let plain_list_item_matcher = parser_with_context!(plain_list_item)(&initial_context); + let plain_list_item_matcher = bind_context!(plain_list_item, &initial_context); let (remaining, (_, result)) = plain_list_item_matcher(input).unwrap(); assert_eq!(Into::<&str>::into(remaining), ""); assert_eq!(result.get_standard_properties().get_source(), "1. foo"); @@ -642,7 +643,7 @@ mod tests { let global_settings = GlobalSettings::default(); let initial_context = ContextElement::document_context(); let initial_context = Context::new(&global_settings, List::new(&initial_context)); - let plain_list_matcher = parser_with_context!(element(true))(&initial_context); + let plain_list_matcher = bind_context!(element(true), &initial_context); let (remaining, result) = plain_list_matcher(input).expect("Should parse the plain list successfully."); assert_eq!(Into::<&str>::into(remaining), " ipsum\n"); @@ -670,7 +671,7 @@ baz"#, let global_settings = GlobalSettings::default(); let initial_context = ContextElement::document_context(); let initial_context = Context::new(&global_settings, List::new(&initial_context)); - let plain_list_matcher = parser_with_context!(element(true))(&initial_context); + let plain_list_matcher = bind_context!(element(true), &initial_context); let (remaining, result) = plain_list_matcher(input).expect("Should parse the plain list successfully."); assert_eq!(Into::<&str>::into(remaining), "baz"); @@ -703,7 +704,7 @@ dolar"#, let global_settings = GlobalSettings::default(); let initial_context = ContextElement::document_context(); let initial_context = Context::new(&global_settings, List::new(&initial_context)); - let plain_list_matcher = parser_with_context!(element(true))(&initial_context); + let plain_list_matcher = bind_context!(element(true), &initial_context); let (remaining, result) = plain_list_matcher(input).expect("Should parse the plain list successfully."); assert_eq!(Into::<&str>::into(remaining), "dolar"); diff --git a/src/parser/plain_text.rs b/src/parser/plain_text.rs index 45cfce47..7cfdd4f3 100644 --- a/src/parser/plain_text.rs +++ b/src/parser/plain_text.rs @@ -114,18 +114,15 @@ impl<'x> RematchObject<'x> for PlainText<'x> { recognize(one_of::<&str, &str, CustomError<_>>(" \t")), line_ending, ))))(goal); - match is_whitespace { - Ok((new_goal, _)) => { - let (new_remaining, _) = many1(org_space_or_line_ending)(remaining)?; - remaining = new_remaining; - goal = new_goal; - continue; - } - Err(_) => {} - }; + if let Ok((new_goal, _)) = is_whitespace { + let (new_remaining, _) = many1(org_space_or_line_ending)(remaining)?; + remaining = new_remaining; + goal = new_goal; + continue; + } return Err(nom::Err::Error(CustomError::MyError(MyError( - "Target does not match.".into(), + "Target does not match.", )))); } @@ -144,6 +141,7 @@ mod tests { use nom::combinator::map; use super::*; + use crate::context::bind_context; use crate::context::Context; use crate::context::ContextElement; use crate::context::GlobalSettings; @@ -158,8 +156,9 @@ mod tests { let initial_context = ContextElement::document_context(); let initial_context = Context::new(&global_settings, List::new(&initial_context)); let (remaining, result) = map( - parser_with_context!(plain_text(detect_standard_set_object_sans_plain_text))( - &initial_context, + bind_context!( + plain_text(detect_standard_set_object_sans_plain_text), + &initial_context ), Object::PlainText, )(input) diff --git a/src/parser/property_drawer.rs b/src/parser/property_drawer.rs index 13ee298e..8f9ae206 100644 --- a/src/parser/property_drawer.rs +++ b/src/parser/property_drawer.rs @@ -40,7 +40,7 @@ pub(crate) fn property_drawer<'b, 'g, 'r, 's>( ) -> Res, PropertyDrawer<'s>> { if immediate_in_section(context, "property-drawer") { return Err(nom::Err::Error(CustomError::MyError(MyError( - "Cannot nest objects of the same element".into(), + "Cannot nest objects of the same element", )))); } let ( diff --git a/src/parser/radio_link.rs b/src/parser/radio_link.rs index c0a47a41..99518814 100644 --- a/src/parser/radio_link.rs +++ b/src/parser/radio_link.rs @@ -53,7 +53,7 @@ pub(crate) fn radio_link<'b, 'g, 'r, 's>( } } Err(nom::Err::Error(CustomError::MyError(MyError( - "NoRadioLink".into(), + "NoRadioLink", )))) } @@ -99,7 +99,7 @@ pub(crate) fn rematch_target<'x, 'b, 'g, 'r, 's>( } _ => { return Err(nom::Err::Error(CustomError::MyError(MyError( - "OnlyMinimalSetObjectsAllowed".into(), + "OnlyMinimalSetObjectsAllowed", )))); } }; diff --git a/src/parser/regular_link.rs b/src/parser/regular_link.rs index dd7a054d..e464c4c3 100644 --- a/src/parser/regular_link.rs +++ b/src/parser/regular_link.rs @@ -139,14 +139,7 @@ fn pathreg<'b, 'g, 'r, 's>( input: OrgSource<'s>, ) -> Res, PathReg<'s>> { let (remaining, path) = map_parser( - escaped( - take_till1(|c| match c { - '\\' | '[' | ']' => true, - _ => false, - }), - '\\', - anychar, - ), + escaped(take_till1(|c| matches!(c, '\\' | '[' | ']')), '\\', anychar), parser_with_context!(parse_path_reg)(context), )(input)?; Ok((remaining, path)) @@ -262,11 +255,8 @@ fn apply_link_templates<'b, 'g, 'r, 's>( }; } // Handle lingering state - match state { - ParserState::Percent => { - ret.push('%'); - } - _ => {} + if let ParserState::Percent = state { + ret.push('%'); } if !injected_value { ret.push_str(inject_value); @@ -494,6 +484,6 @@ fn impl_path_reg_end<'b, 'g, 'r, 's>( } Err(nom::Err::Error(CustomError::MyError(MyError( - "No path reg end".into(), + "No path reg end", )))) } diff --git a/src/parser/section.rs b/src/parser/section.rs index ef587199..4c87545d 100644 --- a/src/parser/section.rs +++ b/src/parser/section.rs @@ -65,12 +65,12 @@ pub(crate) fn zeroth_section<'b, 'g, 'r, 's>( }, )(remaining)?; - comment_and_property_drawer_element.map(|(comment, property_drawer, _ws)| { + if let Some((comment, property_drawer, _ws)) = comment_and_property_drawer_element { children.insert(0, Element::PropertyDrawer(property_drawer)); - comment - .map(Element::Comment) - .map(|ele| children.insert(0, ele)); - }); + if let Some(ele) = comment.map(Element::Comment) { + children.insert(0, ele); + } + } let (remaining, _trailing_ws) = maybe_consume_trailing_whitespace_if_not_exiting(context, remaining)?; @@ -121,12 +121,12 @@ pub(crate) fn section<'b, 'g, 'r, 's>( !children.is_empty() || property_drawer_element.is_some() || planning_element.is_some() }, )(remaining)?; - property_drawer_element - .map(Element::PropertyDrawer) - .map(|ele| children.insert(0, ele)); - planning_element - .map(Element::Planning) - .map(|ele| children.insert(0, ele)); + if let Some(ele) = property_drawer_element.map(Element::PropertyDrawer) { + children.insert(0, ele); + } + if let Some(ele) = planning_element.map(Element::Planning) { + children.insert(0, ele) + } let (remaining, _trailing_ws) = maybe_consume_trailing_whitespace_if_not_exiting(context, remaining)?;