use crate::message::body::{compiler::tokens::Val, BACKSLASH, DOUBLE_QUOTE, GREATER_THAN, SPACE};
use super::prelude::*;
pub(crate) fn val<'a>() -> impl Parser<'a, &'a str, String, ParserError<'a>> + Clone {
let escapable_chars = [BACKSLASH, SPACE, GREATER_THAN];
choice((
backslash().ignore_then(one_of(escapable_chars)),
none_of(escapable_chars),
))
.repeated()
.at_least(1)
.collect()
}
pub(crate) fn quoted_val<'a>() -> impl Parser<'a, &'a str, Val<'a>, ParserError<'a>> + Clone {
let escapable_chars = [BACKSLASH, DOUBLE_QUOTE];
choice((
backslash().ignore_then(one_of(escapable_chars)),
none_of(escapable_chars),
))
.repeated()
.to_slice()
.delimited_by(dquote(), dquote())
}
pub(crate) fn maybe_quoted_const_val(val: &str) -> impl Parser<&str, Val, ParserError> + Clone {
choice((
just(val).to_slice().delimited_by(dquote(), dquote()),
just(val).to_slice(),
))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn val() {
assert_eq!(
super::val().parse("value").into_result(),
Ok("value".into())
);
assert_eq!(
super::val().parse("escaped\\ space\"").into_result(),
Ok("escaped space\"".into()),
);
assert_eq!(
super::val().parse("/home/user/#hello$^yes").into_result(),
Ok("/home/user/#hello$^yes".into()),
);
}
#[test]
fn quoted_val() {
assert_eq!(super::quoted_val().parse("\"\"").into_result(), Ok(""));
assert_eq!(
super::quoted_val().parse("\"quoted val\"").into_result(),
Ok("quoted val"),
);
assert_eq!(
super::quoted_val()
.parse("\"\\\\quoted \\\"val\\\"\"")
.into_result(),
Ok("\\\\quoted \\\"val\\\""),
);
}
#[test]
fn maybe_quoted_val() {
assert_eq!(
super::maybe_quoted_const_val("key")
.parse("key")
.into_result(),
Ok("key")
);
assert_eq!(
super::maybe_quoted_const_val("key")
.parse("\"key\"")
.into_result(),
Ok("key")
);
}
}