use super::{
comment::{comment, mightbespace, shouldbespace},
operator::{assigner, binary},
IResult,
};
use nom::{
branch::alt,
bytes::complete::{tag, tag_no_case},
character::complete::{char, multispace1, satisfy},
combinator::{eof, peek, value},
sequence::{preceded, tuple},
};
pub fn number(i: &str) -> IResult<&str, ()> {
peek(alt((
value((), multispace1), value((), binary), value((), assigner), value((), comment), value((), char(')')), value((), char(']')), value((), char('}')), value((), char('"')), value((), char('\'')), value((), char(';')), value((), char(',')), value((), char('[')), value((), tag("..")), value(
(),
tuple((
char('.'),
mightbespace,
satisfy(|x| x.is_alphanumeric() || x == '$' || x == '*'),
)),
), value((), eof), )))(i)
}
pub fn ident(i: &str) -> IResult<&str, ()> {
peek(alt((
value((), multispace1), value((), binary), value((), assigner), value((), comment), value((), char(')')), value((), char(']')), value((), char('}')), value((), char(';')), value((), char(',')), value((), char('.')), value((), char('…')), value((), char('[')), value((), eof), )))(i)
}
pub fn keyword(i: &str) -> IResult<&str, ()> {
peek(alt((
value((), multispace1), value((), binary), value((), comment), value((), char(')')), value((), char(']')), value((), char('}')), value((), char(';')), value((), char(',')), value((), eof), )))(i)
}
pub fn duration(i: &str) -> IResult<&str, ()> {
peek(alt((
value((), multispace1),
value((), binary),
value((), assigner),
value((), comment),
value((), char(')')),
value((), char(']')),
value((), char('}')),
value((), char(';')),
value((), char(',')),
value((), char('.')),
value((), eof),
)))(i)
}
pub fn field(i: &str) -> IResult<&str, ()> {
peek(alt((
value(
(),
preceded(
shouldbespace,
alt((tag_no_case("FROM"), tag_no_case("TIMEOUT"), tag_no_case("PARALLEL"))),
),
),
value((), char(';')),
value((), eof),
)))(i)
}
pub fn subquery(i: &str) -> IResult<&str, ()> {
peek(alt((
value((), preceded(shouldbespace, tag_no_case("THEN"))),
value((), preceded(shouldbespace, tag_no_case("ELSE"))),
value((), preceded(shouldbespace, tag_no_case("END"))),
|i| {
let (i, _) = mightbespace(i)?;
alt((
value((), eof),
value((), char(';')),
value((), char(',')),
value((), char('}')),
value((), char(')')),
value((), char(']')),
))(i)
},
)))(i)
}
pub fn query(i: &str) -> IResult<&str, ()> {
peek(alt((
value((), preceded(shouldbespace, tag_no_case("THEN"))),
value((), preceded(shouldbespace, tag_no_case("ELSE"))),
value((), preceded(shouldbespace, tag_no_case("END"))),
|i| {
let (i, _) = mightbespace(i)?;
alt((
value((), eof),
value((), char(';')),
value((), char(',')),
value((), char('}')),
value((), char(')')),
value((), char(']')),
))(i)
},
)))(i)
}