1
1
use linked_hash_map:: LinkedHashMap ;
2
- use phf_codegen;
3
2
use std:: fs:: File ;
4
3
use std:: io:: { BufWriter , Write } ;
5
4
@@ -11,7 +10,9 @@ pub fn build() {
11
10
let codes = parse_codes ( ) ;
12
11
13
12
make_type ( & mut file) ;
13
+ make_code ( & codes, & mut file) ;
14
14
make_consts ( & codes, & mut file) ;
15
+ make_inner ( & codes, & mut file) ;
15
16
make_map ( & codes, & mut file) ;
16
17
}
17
18
@@ -38,26 +39,51 @@ fn make_type(file: &mut BufWriter<File>) {
38
39
write ! (
39
40
file,
40
41
"// Autogenerated file - DO NOT EDIT
41
- use std::borrow::Cow;
42
42
43
43
/// A SQLSTATE error code
44
44
#[derive(PartialEq, Eq, Clone, Debug)]
45
- pub struct SqlState(Cow<'static, str> );
45
+ pub struct SqlState(Inner );
46
46
47
47
impl SqlState {{
48
48
/// Creates a `SqlState` from its error code.
49
49
pub fn from_code(s: &str) -> SqlState {{
50
50
match SQLSTATE_MAP.get(s) {{
51
51
Some(state) => state.clone(),
52
- None => SqlState(Cow::Owned (s.to_string ())),
52
+ None => SqlState(Inner::Other (s.into ())),
53
53
}}
54
54
}}
55
+ "
56
+ )
57
+ . unwrap ( ) ;
58
+ }
55
59
60
+ fn make_code ( codes : & LinkedHashMap < String , Vec < String > > , file : & mut BufWriter < File > ) {
61
+ write ! (
62
+ file,
63
+ r#"
56
64
/// Returns the error code corresponding to the `SqlState`.
57
65
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
+ }}
59
85
}}
60
- "
86
+ "#
61
87
)
62
88
. unwrap ( ) ;
63
89
}
@@ -69,7 +95,7 @@ fn make_consts(codes: &LinkedHashMap<String, Vec<String>>, file: &mut BufWriter<
69
95
file,
70
96
r#"
71
97
/// {code}
72
- pub const {name}: SqlState = SqlState(Cow::Borrowed(" {code}") );
98
+ pub const {name}: SqlState = SqlState(Inner::E {code});
73
99
"# ,
74
100
name = name,
75
101
code = code,
@@ -81,6 +107,34 @@ fn make_consts(codes: &LinkedHashMap<String, Vec<String>>, file: &mut BufWriter<
81
107
write ! ( file, "}}" ) . unwrap ( ) ;
82
108
}
83
109
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
+
84
138
fn make_map ( codes : & LinkedHashMap < String , Vec < String > > , file : & mut BufWriter < File > ) {
85
139
let mut builder = phf_codegen:: Map :: new ( ) ;
86
140
for ( code, names) in codes {
0 commit comments