sqlparser_mysql/base/
trigger.rs1use 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}