use crate::Value;
use winnow::{
combinator::{alt, delimited},
error::ContextError,
token::take_until,
ModalResult, Parser,
};
pub(crate) fn parse<'i>(input: &mut &'i str) -> ModalResult<Value<'i>, ContextError> {
alt((
parse_multiline_basic,
parse_basic,
parse_multiline_literal,
parse_literal,
))
.parse_next(input)
}
pub(crate) fn parse_basic<'i>(input: &mut &'i str) -> ModalResult<Value<'i>, ContextError> {
delimited('"', take_until(0.., '"'), '"')
.map(Into::into)
.parse_next(input)
}
pub(crate) fn parse_literal<'i>(input: &mut &'i str) -> ModalResult<Value<'i>, ContextError> {
delimited('\'', take_until(0.., '\''), '\'')
.map(Into::into)
.parse_next(input)
}
pub(crate) fn parse_multiline_basic<'i>(
input: &mut &'i str,
) -> ModalResult<Value<'i>, ContextError> {
delimited(
"\"\"\"",
take_until(0.., "\"\"\"").map(|s: &str| {
s.trim_start_matches('\n')
}),
"\"\"\"",
)
.map(Into::into)
.parse_next(input)
}
pub(crate) fn parse_multiline_literal<'i>(
input: &mut &'i str,
) -> ModalResult<Value<'i>, ContextError> {
delimited(
"'''",
take_until(0.., "'''").map(|s: &str| s.trim_start_matches('\n')), "'''",
)
.map(Into::into)
.parse_next(input)
}