sqlparser_mysql/base/
reference_type.rs

1use nom::branch::alt;
2use nom::bytes::complete::tag_no_case;
3use nom::character::complete::multispace1;
4use nom::combinator::map;
5use nom::sequence::tuple;
6use nom::IResult;
7use std::fmt::{Display, Formatter};
8
9use base::ParseSQLError;
10
11/// reference_option:
12///     `RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT`
13#[derive(Clone, Debug, Eq, Hash, PartialEq, Serialize, Deserialize)]
14pub enum ReferenceType {
15    Restrict,
16    Cascade,
17    SetNull,
18    NoAction,
19    SetDefault,
20}
21
22impl Display for ReferenceType {
23    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
24        match *self {
25            ReferenceType::Restrict => write!(f, "RESTRICT"),
26            ReferenceType::Cascade => write!(f, "CASCADE"),
27            ReferenceType::SetNull => write!(f, "SET NULL"),
28            ReferenceType::NoAction => write!(f, "NO ACTION"),
29            ReferenceType::SetDefault => write!(f, "SET DEFAULT"),
30        }
31    }
32}
33
34impl ReferenceType {
35    pub fn parse(i: &str) -> IResult<&str, ReferenceType, ParseSQLError<&str>> {
36        alt((
37            map(tag_no_case("RESTRICT"), |_| ReferenceType::Restrict),
38            map(tag_no_case("CASCADE"), |_| ReferenceType::Cascade),
39            map(
40                tuple((tag_no_case("SET"), multispace1, tag_no_case("NULL"))),
41                |_| ReferenceType::SetNull,
42            ),
43            map(
44                tuple((tag_no_case("NO"), multispace1, tag_no_case("ACTION"))),
45                |_| ReferenceType::NoAction,
46            ),
47            map(
48                tuple((tag_no_case("SET"), multispace1, tag_no_case("DEFAULT"))),
49                |_| ReferenceType::SetDefault,
50            ),
51        ))(i)
52    }
53}
54
55#[cfg(test)]
56mod tests {
57    use base::reference_type::ReferenceType;
58
59    #[test]
60    fn parse_algorithm_type() {
61        let str1 = "RESTRICT";
62        let res1 = ReferenceType::parse(str1);
63        assert!(res1.is_ok());
64        assert_eq!(res1.unwrap().1, ReferenceType::Restrict);
65
66        let str2 = "SET  NULL  ";
67        let res2 = ReferenceType::parse(str2);
68        assert!(res2.is_ok());
69        assert_eq!(res2.unwrap().1, ReferenceType::SetNull);
70
71        let str3 = "SET DEFAULT";
72        let res3 = ReferenceType::parse(str3);
73        assert!(res3.is_ok());
74        assert_eq!(res3.unwrap().1, ReferenceType::SetDefault);
75    }
76}