sqlparser_mysql/base/
operator.rs1use std::fmt;
2use std::fmt::Display;
3
4use nom::branch::alt;
5use nom::bytes::complete::tag_no_case;
6use nom::combinator::map;
7use nom::IResult;
8
9use base::error::ParseSQLError;
10
11#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
13pub enum Operator {
14 Not,
15 And,
16 Or,
17 Like,
18 NotLike,
19 Equal,
20 NotEqual,
21 Greater,
22 GreaterOrEqual,
23 Less,
24 LessOrEqual,
25 In,
26 NotIn,
27 Is,
28}
29
30impl Operator {
31 pub fn parse(i: &str) -> IResult<&str, Operator, ParseSQLError<&str>> {
32 alt((
33 map(tag_no_case("NOT_LIKE"), |_| Operator::NotLike),
34 map(tag_no_case("LIKE"), |_| Operator::Like),
35 map(tag_no_case("!="), |_| Operator::NotEqual),
36 map(tag_no_case("<>"), |_| Operator::NotEqual),
37 map(tag_no_case(">="), |_| Operator::GreaterOrEqual),
38 map(tag_no_case("<="), |_| Operator::LessOrEqual),
39 map(tag_no_case("="), |_| Operator::Equal),
40 map(tag_no_case("<"), |_| Operator::Less),
41 map(tag_no_case(">"), |_| Operator::Greater),
42 map(tag_no_case("IN"), |_| Operator::In),
43 ))(i)
44 }
45}
46
47impl Display for Operator {
48 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
49 let op = match *self {
50 Operator::Not => "NOT",
51 Operator::And => "AND",
52 Operator::Or => "OR",
53 Operator::Like => "LIKE",
54 Operator::NotLike => "NOT_LIKE",
55 Operator::Equal => "=",
56 Operator::NotEqual => "!=",
57 Operator::Greater => ">",
58 Operator::GreaterOrEqual => ">=",
59 Operator::Less => "<",
60 Operator::LessOrEqual => "<=",
61 Operator::In => "IN",
62 Operator::NotIn => "NOT IN",
63 Operator::Is => "IS",
64 };
65 write!(f, "{}", op)
66 }
67}