sqlparser_mysql/base/
default_or_zero_or_one.rs

1use 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/// {DEFAULT | 0 | 1}
12#[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}