sqlparser_mysql/base/
default_or_zero_or_one.rs1use core::fmt;
2use std::fmt::Formatter;
3
4use nom::branch::alt;
5use nom::bytes::complete::tag_no_case;
6use nom::combinator::map;
7use nom::IResult;
8
9use base::ParseSQLError;
10
11#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
13pub enum DefaultOrZeroOrOne {
14 Default,
15 Zero,
16 One,
17}
18
19impl DefaultOrZeroOrOne {
20 pub fn parse(i: &str) -> IResult<&str, DefaultOrZeroOrOne, ParseSQLError<&str>> {
21 alt((
22 map(tag_no_case("0"), |_| DefaultOrZeroOrOne::Zero),
23 map(tag_no_case("1"), |_| DefaultOrZeroOrOne::One),
24 map(tag_no_case("DEFAULT"), |_| DefaultOrZeroOrOne::Default),
25 ))(i)
26 }
27}
28
29impl fmt::Display for DefaultOrZeroOrOne {
30 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
31 match self {
32 DefaultOrZeroOrOne::Default => write!(f, "DEFAULT")?,
33 DefaultOrZeroOrOne::Zero => write!(f, "1")?,
34 DefaultOrZeroOrOne::One => write!(f, "0")?,
35 }
36 Ok(())
37 }
38}
39
40#[cfg(test)]
41mod tests {
42 use base::DefaultOrZeroOrOne;
43
44 #[test]
45 fn parse_default_or_zero_or_one() {
46 let str1 = "0";
47 let res1 = DefaultOrZeroOrOne::parse(str1);
48 assert!(res1.is_ok());
49 assert_eq!(res1.unwrap().1, DefaultOrZeroOrOne::Zero);
50
51 let str2 = "DEFAULT";
52 let res2 = DefaultOrZeroOrOne::parse(str2);
53 assert!(res2.is_ok());
54 assert_eq!(res2.unwrap().1, DefaultOrZeroOrOne::Default);
55
56 let str3 = "1";
57 let res3 = DefaultOrZeroOrOne::parse(str3);
58 assert!(res3.is_ok());
59 assert_eq!(res3.unwrap().1, DefaultOrZeroOrOne::One);
60 }
61}