Skip to content

Commit a8d6d07

Browse files
authored
Merge pull request #150 from epage/logic
fix(nil): Equality logic missed a case
2 parents 930982c + e0f8270 commit a8d6d07

File tree

4 files changed

+21
-6
lines changed

4 files changed

+21
-6
lines changed

src/parser.rs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use compiler;
1010
use interpreter;
1111
use super::Template;
1212

13-
#[derive(Default)]
13+
#[derive(Default, Clone)]
1414
pub struct ParserBuilder {
1515
blocks: HashMap<String, compiler::BoxedBlockParser>,
1616
tags: HashMap<String, compiler::BoxedTagParser>,
@@ -113,11 +113,13 @@ impl ParserBuilder {
113113
filters::url_encode as interpreter::FnFilterValue)
114114
}
115115

116+
/// Register non-standard filters
116117
#[cfg(not(feature = "extra-filters"))]
117118
pub fn extra_filters(self) -> Self {
118119
self
119120
}
120121

122+
/// Register non-standard filters
121123
#[cfg(feature = "extra-filters")]
122124
pub fn extra_filters(self) -> Self {
123125
self.filter("pluralize",
@@ -150,6 +152,7 @@ impl ParserBuilder {
150152
self
151153
}
152154

155+
/// Create a parser
153156
pub fn build(self) -> Parser {
154157
let Self {
155158
blocks,
@@ -169,7 +172,7 @@ impl ParserBuilder {
169172
}
170173
}
171174

172-
#[derive(Default)]
175+
#[derive(Default, Clone)]
173176
pub struct Parser {
174177
options: compiler::LiquidOptions,
175178
filters: HashMap<String, interpreter::BoxedValueFilter>,

src/tags/if_block.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ pub fn unless_block(_tag_name: &str,
8787
tokens: &[Element],
8888
options: &LiquidOptions)
8989
-> Result<Box<Renderable>> {
90-
let cond = try!(condition(arguments));
90+
let cond = condition(arguments)?;
9191
Ok(Box::new(Conditional {
9292
condition: cond,
9393
mode: false,
@@ -101,7 +101,7 @@ pub fn if_block(_tag_name: &str,
101101
tokens: &[Element],
102102
options: &LiquidOptions)
103103
-> Result<Box<Renderable>> {
104-
let cond = try!(condition(arguments));
104+
let cond = condition(arguments)?;
105105

106106
let (leading_tokens, trailing_tokens) = split_block(&tokens[..], &["else", "elsif"], options);
107107
let if_false = match trailing_tokens {
@@ -202,6 +202,16 @@ mod test {
202202
"nope",
203203
"{% endif %}");
204204

205+
let tokens = compiler::tokenize(&text).unwrap();
206+
let template = compiler::parse(&tokens, &options())
207+
.map(interpreter::Template::new)
208+
.unwrap();
209+
210+
let mut context = Context::new();
211+
context.set_global_val("truthy", Value::Nil);
212+
let output = template.render(&mut context).unwrap();
213+
assert_eq!(output, Some("nope".to_owned()));
214+
205215
let tokens = compiler::tokenize(&text).unwrap();
206216
let template = compiler::parse(&tokens, &options())
207217
.map(interpreter::Template::new)

src/template.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ pub struct Template {
1212
}
1313

1414
impl Template {
15+
/// Renders an instance of the Template, using the given globals.
1516
pub fn render(&self, globals: &Object) -> Result<String> {
1617
let mut data = interpreter::Context::new()
1718
.with_filters(self.filters.clone())

src/value/values.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,9 @@ impl PartialEq<Value> for Value {
147147
(&Value::Object(ref x), &Value::Object(ref y)) => x == y,
148148
(&Value::Nil, &Value::Nil) => true,
149149

150-
// encode Ruby truthiness; all values except false and nil
151-
// are true, and we don't have a notion of nil
150+
// encode Ruby truthiness: all values except false and nil are true
151+
(&Value::Nil, &Value::Bool(b)) |
152+
(&Value::Bool(b), &Value::Nil) => !b,
152153
(_, &Value::Bool(b)) |
153154
(&Value::Bool(b), _) => b,
154155

0 commit comments

Comments
 (0)