use crate::puppet_parser::{common::capture_comment, range::Range, IResult, ParseError, Span};
use nom::{
bytes::complete::tag,
combinator::{map, opt},
sequence::{pair, preceded, tuple},
};
pub fn parse(input: Span) -> IResult<crate::puppet_lang::argument::Argument<Range>> {
let parser = tuple((
super::common::space0_delimimited(opt(crate::puppet_parser::typing::parse_type_specification)),
tag("$"),
ParseError::protect(
|_| "Invalid variable name".to_owned(),
crate::puppet_parser::identifier::identifier,
),
opt(preceded(
crate::puppet_parser::common::space0_delimimited(tag("=")),
ParseError::protect(
|_| "Expected expression after '='".to_owned(),
crate::puppet_parser::expression::parse_expression,
),
)),
));
map(
pair(capture_comment, parser),
move |(comment, (type_spec, dollar_sign, name, default))| {
let start_range = match &type_spec {
None => Range::from((dollar_sign, dollar_sign)),
Some(v) => v.extra.clone(),
};
let end_range = match &default {
None => Range::from((name, name)),
Some(v) => v.extra.clone(),
};
crate::puppet_lang::argument::Argument {
type_spec,
extra: Range::from((&start_range, &end_range)),
name: name.to_string(),
default,
comment,
}
},
)(input)
}