use super::super::{Argument, Arguments, Range, Result};
use super::parser::Parser;
use super::values::{_try_parse_enclosed_string, _try_parse_nude_string};
pub(crate) fn _try_parse_arguments<'doc>(
parser: &Parser<'doc>,
) -> Result<Option<(Arguments, Parser<'doc>)>> {
let begin = parser.get_position();
let mut p_current = parser.clone();
let mut arguments = Vec::new();
loop {
let p_current_after_whitespaces = p_current.skip_many_whitespaces_immutable();
if p_current_after_whitespaces.remain().starts_with("-->") {
break;
}
match _try_parse_argument(&p_current_after_whitespaces)? {
Some((arg, p_next)) => {
arguments.push(arg);
p_current = p_next;
}
None => break, }
}
if arguments.is_empty() {
return Ok(None);
}
let end = p_current.get_position();
Ok(Some((
Arguments {
arguments,
range: Range { begin, end },
},
p_current,
)))
}
pub(crate) fn _try_parse_argument<'doc>(
parser: &Parser<'doc>,
) -> Result<Option<(Argument, Parser<'doc>)>> {
let begin = parser.get_position();
if let Some((value, p)) = _try_parse_enclosed_string(&parser, "'")? {
let end = p.get_position();
let arg = Argument {
value,
range: Range { begin, end },
};
return Ok(Some((arg, p)));
}
if let Some((value, p)) = _try_parse_enclosed_string(&parser, "\"")? {
let end = p.get_position();
let arg = Argument {
value,
range: Range { begin, end },
};
return Ok(Some((arg, p)));
}
if let Some((value, p)) = _try_parse_nude_string(parser)? {
let end = p.get_position();
let arg = Argument {
value,
range: Range { begin, end },
};
return Ok(Some((arg, p)));
}
Ok(None)
}