use crate::comment::comment;
use crate::comment::{mightbespace, shouldbespace};
use crate::error::IResult;
use crate::operator::{assigner, binary};
use nom::branch::alt;
use nom::bytes::complete::tag;
use nom::bytes::complete::tag_no_case;
use nom::character::complete::char;
use nom::character::complete::multispace1;
use nom::combinator::peek;
use nom::combinator::{eof, value};
use nom::sequence::preceded;
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((), tag("..")), 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, tag_no_case("FROM"))),
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)
}