From 30b732404971a5320164e82c97784ad316c2bf83 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 16 May 2020 19:05:03 -0400 Subject: [PATCH] Implement less-than. --- .../{_helpers_lt => helpers_lt}/input1.json | 0 .../{_helpers_lt => helpers_lt}/main.dust | 0 src/parser/parser.rs | 8 ++-- src/renderer/inline_partial_tree.rs | 4 +- src/renderer/renderer.rs | 38 ++++++++++++++++++- 5 files changed, 43 insertions(+), 7 deletions(-) rename js/test_cases/{_helpers_lt => helpers_lt}/input1.json (100%) rename js/test_cases/{_helpers_lt => helpers_lt}/main.dust (100%) diff --git a/js/test_cases/_helpers_lt/input1.json b/js/test_cases/helpers_lt/input1.json similarity index 100% rename from js/test_cases/_helpers_lt/input1.json rename to js/test_cases/helpers_lt/input1.json diff --git a/js/test_cases/_helpers_lt/main.dust b/js/test_cases/helpers_lt/main.dust similarity index 100% rename from js/test_cases/_helpers_lt/main.dust rename to js/test_cases/helpers_lt/main.dust diff --git a/src/parser/parser.rs b/src/parser/parser.rs index 3b8b30c..a742fa3 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -38,8 +38,8 @@ pub enum DustTag<'a> { DTHelperNotEquals(ParameterizedBlock<'a>), DTHelperGreaterThan(ParameterizedBlock<'a>), DTHelperLessThan(ParameterizedBlock<'a>), - DTHelperGreaterThenOrEquals(ParameterizedBlock<'a>), - DTHelperLessThenOrEquals(ParameterizedBlock<'a>), + DTHelperGreaterThanOrEquals(ParameterizedBlock<'a>), + DTHelperLessThanOrEquals(ParameterizedBlock<'a>), } #[derive(Clone, Debug, PartialEq)] @@ -162,8 +162,8 @@ fn dust_tag(i: &str) -> IResult<&str, DustTag> { named_block("{+", DustTag::DTBlock), named_block("{<", DustTag::DTInlinePartial), partial("{>", DustTag::DTPartial), - parameterized_block("{@", "gte", DustTag::DTHelperGreaterThenOrEquals), - parameterized_block("{@", "lte", DustTag::DTHelperLessThenOrEquals), + parameterized_block("{@", "gte", DustTag::DTHelperGreaterThanOrEquals), + parameterized_block("{@", "lte", DustTag::DTHelperLessThanOrEquals), parameterized_block("{@", "eq", DustTag::DTHelperEquals), parameterized_block("{@", "ne", DustTag::DTHelperNotEquals), parameterized_block("{@", "gt", DustTag::DTHelperGreaterThan), diff --git a/src/renderer/inline_partial_tree.rs b/src/renderer/inline_partial_tree.rs index b37d40b..ff7220b 100644 --- a/src/renderer/inline_partial_tree.rs +++ b/src/renderer/inline_partial_tree.rs @@ -139,7 +139,7 @@ fn extract_inline_partials_from_tag<'a, 'b>( Some(body) => extract_inline_partials_from_body(blocks, &body), }; } - DustTag::DTHelperGreaterThenOrEquals(parameterized_block) => { + DustTag::DTHelperGreaterThanOrEquals(parameterized_block) => { match ¶meterized_block.contents { None => (), Some(body) => extract_inline_partials_from_body(blocks, &body), @@ -149,7 +149,7 @@ fn extract_inline_partials_from_tag<'a, 'b>( Some(body) => extract_inline_partials_from_body(blocks, &body), }; } - DustTag::DTHelperLessThenOrEquals(parameterized_block) => { + DustTag::DTHelperLessThanOrEquals(parameterized_block) => { match ¶meterized_block.contents { None => (), Some(body) => extract_inline_partials_from_body(blocks, &body), diff --git a/src/renderer/renderer.rs b/src/renderer/renderer.rs index ec645f0..3e29c6f 100644 --- a/src/renderer/renderer.rs +++ b/src/renderer/renderer.rs @@ -323,7 +323,7 @@ impl<'a> DustRenderer<'a> { } } } - DustTag::DTHelperGreaterThenOrEquals(parameterized_block) => { + DustTag::DTHelperGreaterThanOrEquals(parameterized_block) => { let param_map: HashMap<&str, &RValue<'a>> = Self::get_rval_map(¶meterized_block.params); let left_side: Result<&dyn ContextElement, WalkError> = @@ -359,6 +359,42 @@ impl<'a> DustRenderer<'a> { } } } + DustTag::DTHelperLessThan(parameterized_block) => { + let param_map: HashMap<&str, &RValue<'a>> = + Self::get_rval_map(¶meterized_block.params); + let left_side: Result<&dyn ContextElement, WalkError> = + match Self::get_rval(breadcrumbs, ¶m_map, "key") { + None => return Ok("".to_owned()), + Some(res) => res, + }; + let right_side: Result<&dyn ContextElement, WalkError> = + Self::get_rval(breadcrumbs, ¶m_map, "value") + .unwrap_or(Err(WalkError::CantWalk)); + match (left_side, right_side) { + (Err(_), _) | (_, Err(_)) => { + return self.render_maybe_body( + ¶meterized_block.else_contents, + breadcrumbs, + blocks, + ) + } + (Ok(left_side_unwrapped), Ok(right_side_unwrapped)) => { + if left_side_unwrapped < right_side_unwrapped { + return self.render_maybe_body( + ¶meterized_block.contents, + breadcrumbs, + blocks, + ); + } else { + return self.render_maybe_body( + ¶meterized_block.else_contents, + breadcrumbs, + blocks, + ); + } + } + } + } _ => (), // TODO: Implement the rest } Ok("".to_owned())