in guard/src/rules/parser.rs [1148:1194]
fn assignment(input: Span) -> IResult<Span, LetExpr> {
let (input, _let_keyword) = tag("let")(input)?;
let (input, (var_name, _eq_sign)) = tuple((
//
// if we have a pattern like "letproperty" that can be an access keyword
// then there is no space in between. This will error out.
//
preceded(one_or_more_ws_or_comment, var_name),
//
// if we succeed in reading the form "let <var_name>", it must be be
// followed with an assignment sign "=" or ":="
//
cut(
preceded(
zero_or_more_ws_or_comment,
alt((tag("="), tag(":=")))
)
),
))(input)?;
match parse_value(input) {
Ok((input, value)) => Ok((input, LetExpr {
var: var_name,
value: LetValue::Value(value)
})),
Err(nom::Err::Error(_)) => {
//
// if we did not succeed in parsing a value object, then
// if must be an access pattern, else it is a failure
//
let (input, access) = cut(
preceded(
zero_or_more_ws_or_comment,
access
)
)(input)?;
Ok((input, LetExpr {
var: var_name,
value: LetValue::AccessClause(access),
}))
},
Err(e) => Err(e)
}
}