Skip to content

Commit 05a0643

Browse files
committed
Fix matching on SqlState
Closes #756
1 parent c7a8adf commit 05a0643

File tree

2 files changed

+852
-289
lines changed

2 files changed

+852
-289
lines changed

codegen/src/sqlstate.rs

+61-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
use linked_hash_map::LinkedHashMap;
2-
use phf_codegen;
32
use std::fs::File;
43
use std::io::{BufWriter, Write};
54

@@ -11,7 +10,9 @@ pub fn build() {
1110
let codes = parse_codes();
1211

1312
make_type(&mut file);
13+
make_code(&codes, &mut file);
1414
make_consts(&codes, &mut file);
15+
make_inner(&codes, &mut file);
1516
make_map(&codes, &mut file);
1617
}
1718

@@ -38,26 +39,51 @@ fn make_type(file: &mut BufWriter<File>) {
3839
write!(
3940
file,
4041
"// Autogenerated file - DO NOT EDIT
41-
use std::borrow::Cow;
4242
4343
/// A SQLSTATE error code
4444
#[derive(PartialEq, Eq, Clone, Debug)]
45-
pub struct SqlState(Cow<'static, str>);
45+
pub struct SqlState(Inner);
4646
4747
impl SqlState {{
4848
/// Creates a `SqlState` from its error code.
4949
pub fn from_code(s: &str) -> SqlState {{
5050
match SQLSTATE_MAP.get(s) {{
5151
Some(state) => state.clone(),
52-
None => SqlState(Cow::Owned(s.to_string())),
52+
None => SqlState(Inner::Other(s.into())),
5353
}}
5454
}}
55+
"
56+
)
57+
.unwrap();
58+
}
5559

60+
fn make_code(codes: &LinkedHashMap<String, Vec<String>>, file: &mut BufWriter<File>) {
61+
write!(
62+
file,
63+
r#"
5664
/// Returns the error code corresponding to the `SqlState`.
5765
pub fn code(&self) -> &str {{
58-
&self.0
66+
match &self.0 {{"#,
67+
)
68+
.unwrap();
69+
70+
for code in codes.keys() {
71+
write!(
72+
file,
73+
r#"
74+
Inner::E{code} => "{code}","#,
75+
code = code,
76+
)
77+
.unwrap();
78+
}
79+
80+
write!(
81+
file,
82+
r#"
83+
Inner::Other(code) => code,
84+
}}
5985
}}
60-
"
86+
"#
6187
)
6288
.unwrap();
6389
}
@@ -69,7 +95,7 @@ fn make_consts(codes: &LinkedHashMap<String, Vec<String>>, file: &mut BufWriter<
6995
file,
7096
r#"
7197
/// {code}
72-
pub const {name}: SqlState = SqlState(Cow::Borrowed("{code}"));
98+
pub const {name}: SqlState = SqlState(Inner::E{code});
7399
"#,
74100
name = name,
75101
code = code,
@@ -81,6 +107,34 @@ fn make_consts(codes: &LinkedHashMap<String, Vec<String>>, file: &mut BufWriter<
81107
write!(file, "}}").unwrap();
82108
}
83109

110+
fn make_inner(codes: &LinkedHashMap<String, Vec<String>>, file: &mut BufWriter<File>) {
111+
write!(
112+
file,
113+
r#"
114+
115+
#[derive(PartialEq, Eq, Clone, Debug)]
116+
enum Inner {{"#,
117+
)
118+
.unwrap();
119+
for code in codes.keys() {
120+
write!(
121+
file,
122+
r#"
123+
E{},"#,
124+
code,
125+
)
126+
.unwrap();
127+
}
128+
write!(
129+
file,
130+
r#"
131+
Other(Box<str>),
132+
}}
133+
"#,
134+
)
135+
.unwrap();
136+
}
137+
84138
fn make_map(codes: &LinkedHashMap<String, Vec<String>>, file: &mut BufWriter<File>) {
85139
let mut builder = phf_codegen::Map::new();
86140
for (code, names) in codes {

0 commit comments

Comments
 (0)