use super::*;
fn inline_list_kserds<'a, E: CxErr<'a>>(i: &'a str) -> IResult<&'a str, Vec<Kserd<'a>>, E> {
context(
"comma separated kserds",
separated_list0(
ignore_inline_whitespace(char(',')),
ignore_inline_whitespace(kserd_inline),
),
)(i)
}
fn concise_list_kserds<'a, E: CxErr<'a>>(i: &'a str) -> IResult<&'a str, Vec<Kserd<'a>>, E> {
preceded(
multiline_whitespace,
cut(terminated(
separated_list0(multiline_whitespace, kserd_concise),
multiline_whitespace,
)),
)(i)
}
pub(super) fn tuple<'a, E: CxErr<'a>>(
force_inline: bool,
) -> impl Fn(&'a str) -> IResult<&'a str, Kserd<'a>, E> {
move |i: &'a str| {
let (i, ident) = opt(ident(false))(i)?;
let (i, _) = ignore_inline_whitespace(char('('))(i)?;
let concise = recognise_concise(i) && !force_inline;
let parser = if concise {
concise_list_kserds
} else {
inline_list_kserds
};
let ctx = if concise {
"multi-line (concise) tuple"
} else {
"inline tuple"
};
let (i, value) = context(
ctx,
cut(terminated(parser, ignore_inline_whitespace(char(')')))),
)(i)?;
let value = Value::Tuple(value);
Ok((i, kserd_ctor(ident, value)))
}
}
pub(super) fn seq_delimited<'a, E: CxErr<'a>>(
force_inline: bool,
) -> impl Fn(&'a str) -> IResult<&'a str, Kserd<'a>, E> {
move |i: &'a str| {
let (i, ident) = opt(ident(false))(i)?;
let (i, _) = ignore_inline_whitespace(char('['))(i)?;
let concise = recognise_concise(i) && !force_inline;
let parser = if concise {
concise_list_kserds
} else {
inline_list_kserds
};
let ctx = if concise {
"multi-line (concise) sequence"
} else {
"inline sequence"
};
let (i, value) = context(
ctx,
cut(terminated(parser, ignore_inline_whitespace(char(']')))),
)(i)?;
let value = Value::Seq(value);
Ok((i, kserd_ctor(ident, value)))
}
}