sqlparser_mysql/base/
trigger.rs

1use std::fmt;
2use std::str;
3
4use nom::bytes::complete::tag;
5use nom::combinator::{map, opt};
6use nom::sequence::{pair, tuple};
7use nom::IResult;
8
9use base::error::ParseSQLError;
10use base::{CommonParser, DisplayUtil};
11
12#[derive(Clone, Debug, Default, Eq, Hash, PartialEq, Serialize, Deserialize)]
13pub struct Trigger {
14    pub name: String,
15    pub schema: Option<String>,
16}
17
18impl Trigger {
19    pub fn parse(i: &str) -> IResult<&str, Trigger, ParseSQLError<&str>> {
20        map(
21            tuple((
22                opt(pair(CommonParser::sql_identifier, tag("."))),
23                CommonParser::sql_identifier,
24            )),
25            |tup| Trigger {
26                name: String::from(tup.1),
27                schema: tup.0.map(|(schema, _)| String::from(schema)),
28            },
29        )(i)
30    }
31}
32
33impl fmt::Display for Trigger {
34    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
35        if let Some(ref schema) = self.schema {
36            write!(f, "{}.", DisplayUtil::escape_if_keyword(schema))?;
37        }
38        write!(f, "{}", DisplayUtil::escape_if_keyword(&self.name))?;
39        Ok(())
40    }
41}
42
43impl<'a> From<&'a str> for Trigger {
44    fn from(t: &str) -> Trigger {
45        Trigger {
46            name: String::from(t),
47            schema: None,
48        }
49    }
50}
51
52impl<'a> From<(&'a str, &'a str)> for Trigger {
53    fn from(t: (&str, &str)) -> Trigger {
54        Trigger {
55            name: String::from(t.1),
56            schema: Some(String::from(t.0)),
57        }
58    }
59}
60
61#[cfg(test)]
62mod tests {
63    use base::Trigger;
64    use nom::combinator::into;
65
66    #[test]
67    fn parse_trigger() {
68        let str1 = "trigger_name";
69        let res1 = Trigger::parse(str1);
70        let exp1 = Trigger {
71            name: "trigger_name".to_string(),
72            schema: None,
73        };
74        assert!(res1.is_ok());
75        assert_eq!(res1.unwrap().1, exp1);
76
77        let str2 = "foo.trigger_name";
78        let res2 = Trigger::parse(str2);
79        let exp2 = Trigger {
80            name: "trigger_name".to_string(),
81            schema: Some("foo".to_string()),
82        };
83        assert!(res2.is_ok());
84        assert_eq!(res2.unwrap().1, exp2);
85    }
86
87    #[test]
88    fn from_str() {
89        let trigger1: Trigger = "trigger_name".into();
90        let exp1 = Trigger {
91            name: "trigger_name".to_string(),
92            schema: None,
93        };
94        assert_eq!(trigger1, exp1);
95    }
96
97    #[test]
98    fn from_tuple_str() {
99        let trigger2: Trigger = ("foo", "trigger_name").into();
100        let exp2 = Trigger {
101            name: "trigger_name".to_string(),
102            schema: Some("foo".to_string()),
103        };
104        assert_eq!(trigger2, exp2);
105    }
106}