Add parser support for select/any/none.

master
Tom Alexander 4 years ago
parent 84c07b262c
commit a61807d84c
Signed by: talexander
GPG Key ID: D3A179C9A53C0EDE

@ -87,14 +87,14 @@ Early termination{~n}
{/pet_names}
{/select}{~n}
Default{~n}
======={~n}
Early termination stand-alone comparison{~n}
========================================{~n}
{@select key=pet}
{@eq key="duck" value="duck"}Lets name your pet quackers{~n}{/eq}
{@eq value="cat"}Lets name your pet whiskers{~n}{/eq}
{@eq value="dog"}Lets name your pet rover{~n}{/eq}
{@eq value="lizard"}Lets name your pet dave{~n}{/eq}
{@default}Fenton is a good name for any pet{~n}{/default}
{@any}{person} has a pet!{~n}{/any}
{@none}I don't know what to name {person}'s pet...{~n}{/none}
text not inside a comparison{~n}
{#pet_names}
If your pet was a {type} we'd name it {pet_name}{~n}

@ -44,6 +44,9 @@ pub enum DustTag<'a> {
DTHelperSep(ParameterizedBlock<'a>),
DTHelperFirst(ParameterizedBlock<'a>),
DTHelperLast(ParameterizedBlock<'a>),
DTHelperSelect(ParameterizedBlock<'a>),
DTHelperAny(ParameterizedBlock<'a>),
DTHelperNone(ParameterizedBlock<'a>),
}
#[derive(Clone, Debug, PartialEq)]
@ -219,6 +222,15 @@ fn dust_tag(i: &str) -> IResult<&str, DustTag> {
DustTag::DTInlinePartial,
),
partial("{>", DustTag::DTPartial),
dust_tag_helper,
))(i)
}
/// Nom's alt() is limited to 21 possibilities, so I pushed this out
/// into its own parser. Otherwise there is no reason for this not to
/// be part of the dust_tag parser.
fn dust_tag_helper(i: &str) -> IResult<&str, DustTag> {
alt((
map(
parameterized_block("{@", &tag_to_path("gte")),
DustTag::DTHelperGreaterThanOrEquals,
@ -255,6 +267,18 @@ fn dust_tag(i: &str) -> IResult<&str, DustTag> {
parameterized_block("{@", &tag_to_path("last")),
DustTag::DTHelperLast,
),
map(
parameterized_block("{@", &tag_to_path("select")),
DustTag::DTHelperSelect,
),
map(
parameterized_block("{@", &tag_to_path("any")),
DustTag::DTHelperAny,
),
map(
parameterized_block("{@", &tag_to_path("none")),
DustTag::DTHelperNone,
),
))(i)
}

@ -100,87 +100,18 @@ fn extract_inline_partials_from_tag<'a, 'b>(
blocks.insert(&named_block.path.keys[0], &named_block.contents);
}
DustTag::DTBlock(..) => (),
DustTag::DTHelperEquals(parameterized_block) => {
match &parameterized_block.contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),
};
match &parameterized_block.else_contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),
};
}
DustTag::DTHelperNotEquals(parameterized_block) => {
match &parameterized_block.contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),
};
match &parameterized_block.else_contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),
};
}
DustTag::DTHelperGreaterThan(parameterized_block) => {
match &parameterized_block.contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),
};
match &parameterized_block.else_contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),
};
}
DustTag::DTHelperLessThan(parameterized_block) => {
match &parameterized_block.contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),
};
match &parameterized_block.else_contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),
};
}
DustTag::DTHelperGreaterThanOrEquals(parameterized_block) => {
match &parameterized_block.contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),
};
match &parameterized_block.else_contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),
};
}
DustTag::DTHelperLessThanOrEquals(parameterized_block) => {
match &parameterized_block.contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),
};
match &parameterized_block.else_contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),
};
}
DustTag::DTHelperSep(parameterized_block) => {
match &parameterized_block.contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),
};
match &parameterized_block.else_contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),
};
}
DustTag::DTHelperFirst(parameterized_block) => {
match &parameterized_block.contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),
};
match &parameterized_block.else_contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),
};
}
DustTag::DTHelperLast(parameterized_block) => {
DustTag::DTHelperEquals(parameterized_block)
| DustTag::DTHelperNotEquals(parameterized_block)
| DustTag::DTHelperGreaterThan(parameterized_block)
| DustTag::DTHelperLessThan(parameterized_block)
| DustTag::DTHelperGreaterThanOrEquals(parameterized_block)
| DustTag::DTHelperLessThanOrEquals(parameterized_block)
| DustTag::DTHelperSep(parameterized_block)
| DustTag::DTHelperFirst(parameterized_block)
| DustTag::DTHelperLast(parameterized_block)
| DustTag::DTHelperSelect(parameterized_block)
| DustTag::DTHelperAny(parameterized_block)
| DustTag::DTHelperNone(parameterized_block) => {
match &parameterized_block.contents {
None => (),
Some(body) => extract_inline_partials_from_body(blocks, &body),

@ -756,6 +756,9 @@ impl<'a> DustRenderer<'a> {
}
}
}
DustTag::DTHelperSelect(parameterized_block) => todo!(),
DustTag::DTHelperAny(parameterized_block) => todo!(),
DustTag::DTHelperNone(parameterized_block) => todo!(),
}
Ok("".to_owned())

Loading…
Cancel
Save