Factor out the parsing of partial template names into its own parser for reuse as an rvalue.

This commit is contained in:
Tom Alexander
2020-05-30 15:45:44 -04:00
parent 4932a4bb6f
commit 3352b777ae
3 changed files with 42 additions and 29 deletions

View File

@@ -110,13 +110,14 @@ pub struct Partial<'a> {
#[derive(Clone, Debug, PartialEq)]
pub enum OwnedLiteral {
LString(String),
LPositiveInteger(u64),
LString(String),
}
#[derive(Clone, Debug, PartialEq)]
pub enum RValue<'a> {
RVPath(Path<'a>),
// RVTemplate(Vec<PartialNameElement>),
RVLiteral(OwnedLiteral),
}
@@ -308,6 +309,20 @@ fn postitive_integer_literal(i: &str) -> IResult<&str, u64> {
)(i)
}
fn template_string_rvalue(i: &str) -> IResult<&str, Vec<PartialNameElement>> {
let (i, template_string) = verify(quoted_string, |s: &String| {
partial_quoted_tag(s.as_str()).is_ok()
})(i)?;
let (_remaining, parsed_template_elements) = partial_quoted_tag(template_string.as_str())
.expect("A successful parse was verified earlier with a call to verify()");
let converted_template_elements = parsed_template_elements
.into_iter()
.map(|e| e.into())
.collect();
Ok((i, converted_template_elements))
}
/// Either a literal or a path to a value
fn rvalue(i: &str) -> IResult<&str, RValue> {
alt((
@@ -528,9 +543,7 @@ fn partial_with_quoted_tag<'a>(
let (i, (name, maybe_explicit_context, params)) = delimited(
tag(open_matcher),
tuple((
verify(quoted_string, |s: &String| {
partial_quoted_tag(s.as_str()).is_ok()
}),
template_string_rvalue,
opt(preceded(tag(":"), path)),
opt(delimited(
space1,
@@ -541,17 +554,10 @@ fn partial_with_quoted_tag<'a>(
tag("/}"),
)(i)?;
let (_remaining, template_name_elements) = partial_quoted_tag(name.as_str())
.expect("A successful parse was verified earlier with a call to verify()");
let partial_name_elements = template_name_elements
.into_iter()
.map(|e| e.into())
.collect();
Ok((
i,
Partial {
name: partial_name_elements,
name: name,
explicit_context: maybe_explicit_context,
params: params.unwrap_or(Vec::new()),
},