From 726ca1cc3356f7aa59d7c2730c9f3b3588236cb0 Mon Sep 17 00:00:00 2001 From: René Kijewski Date: Fri, 30 Jul 2021 17:04:30 +0200 Subject: Add {% break %} and {% continue %} This PR adds `{% break %}` and `{% continue %}` statements to break out of a loop, or continue with the next element of the iterator. --- testing/templates/for-break-continue.html | 11 +++++ testing/tests/loops.rs | 68 +++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) create mode 100644 testing/templates/for-break-continue.html (limited to 'testing') diff --git a/testing/templates/for-break-continue.html b/testing/templates/for-break-continue.html new file mode 100644 index 0000000..c7a948f --- /dev/null +++ b/testing/templates/for-break-continue.html @@ -0,0 +1,11 @@ +{%- for v in values -%} + x {{- v -}} + {%- if matches!(v, x if *x > 9) -%} + {%- if matches!(v, x if *x % 2 == 0) -%} + {%- break -%} + {%- else -%} + {%- continue -%} + {%- endif -%} + {%- endif -%} + y +{%- endfor -%} diff --git a/testing/tests/loops.rs b/testing/tests/loops.rs index fffb39d..49c37e0 100644 --- a/testing/tests/loops.rs +++ b/testing/tests/loops.rs @@ -304,3 +304,71 @@ fn test_for_enumerate() { }; assert_eq!(t.render().unwrap(), "0=hello-1=world-2=!-"); } + +#[derive(Template)] +#[template( + source = "{% for v in values.iter() %}x{{v}}{% if matches!(v, x if *x==3) %}{% break %}{% endif %}y{% endfor %}", + ext = "txt" +)] +struct Break<'a> { + values: &'a [i32], +} + +#[test] +fn test_loop_break() { + let t = Break { + values: &[1, 2, 3, 4, 5], + }; + assert_eq!(t.render().unwrap(), "x1yx2yx3"); + + let t = Break { + values: &[1, 2, 4, 5], + }; + assert_eq!(t.render().unwrap(), "x1yx2yx4yx5y"); +} + +#[derive(Template)] +#[template( + source = "{% for v in values %}x{{v}}{% if matches!(v, x if *x==3) %}{% continue %}{% endif %}y{% endfor %}", + ext = "txt" +)] +struct Continue<'a> { + values: &'a [i32], +} + +#[test] +fn test_loop_continue() { + let t = Continue { + values: &[1, 2, 3, 4, 5], + }; + assert_eq!(t.render().unwrap(), "x1yx2yx3x4yx5y"); + + let t = Continue { + values: &[1, 2, 4, 5], + }; + assert_eq!(t.render().unwrap(), "x1yx2yx4yx5y"); +} + +#[derive(Template)] +#[template(path = "for-break-continue.html")] +struct BreakContinue<'a> { + values: &'a [i32], +} + +#[test] +fn test_loop_break_continue() { + let t = BreakContinue { + values: &[1, 2, 3, 4, 5], + }; + assert_eq!(t.render().unwrap(), "x1yx2yx3yx4yx5y"); + + let t = BreakContinue { + values: &[1, 2, 3, 10, 4, 5], + }; + assert_eq!(t.render().unwrap(), "x1yx2yx3yx10"); + + let t = BreakContinue { + values: &[1, 2, 3, 11, 4, 5], + }; + assert_eq!(t.render().unwrap(), "x1yx2yx3yx11x4yx5y"); +} -- cgit