1
+ use std:: io;
2
+ use std:: fmt;
3
+
1
4
use regex;
2
5
6
+ #[ derive( Debug ) ]
7
+ pub enum LicenseError {
8
+ IO ( io:: Error ) ,
9
+ Regex ( regex:: Error ) ,
10
+ Parse ( String ) ,
11
+ }
12
+
13
+ impl fmt:: Display for LicenseError {
14
+ fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
15
+ match * self {
16
+ LicenseError :: IO ( ref err) => err. fmt ( f) ,
17
+ LicenseError :: Regex ( ref err) => err. fmt ( f) ,
18
+ LicenseError :: Parse ( ref err) => write ! ( f, "parsing failed, {}" , err) ,
19
+ }
20
+ }
21
+ }
22
+
23
+ impl From < io:: Error > for LicenseError {
24
+ fn from ( err : io:: Error ) -> LicenseError {
25
+ LicenseError :: IO ( err)
26
+ }
27
+ }
28
+
29
+ impl From < regex:: Error > for LicenseError {
30
+ fn from ( err : regex:: Error ) -> LicenseError {
31
+ LicenseError :: Regex ( err)
32
+ }
33
+ }
34
+
3
35
// the template is parsed using a state machine
4
36
enum ParsingState {
5
37
Lit ,
@@ -76,7 +108,7 @@ impl TemplateParser {
76
108
/// "
77
109
/// );
78
110
/// ```
79
- pub fn parse ( template : & str ) -> Result < String , String > {
111
+ pub fn parse ( template : & str ) -> Result < String , LicenseError > {
80
112
let mut parser = Self :: new ( ) ;
81
113
for chr in template. chars ( ) {
82
114
if chr == '\n' {
@@ -87,19 +119,24 @@ impl TemplateParser {
87
119
LitEsc => parser. trans_from_litesc ( chr) ,
88
120
Re ( brace_nesting) => parser. trans_from_re ( chr, brace_nesting) ,
89
121
ReEsc ( brace_nesting) => parser. trans_from_reesc ( chr, brace_nesting) ,
90
- Abort ( msg) => return Err ( msg) ,
122
+ Abort ( msg) => return Err ( LicenseError :: Parse ( msg) ) ,
91
123
} ;
92
124
}
93
125
// check if we've ended parsing in a valid state
94
126
match parser. state {
95
- Abort ( msg) => return Err ( msg) ,
127
+ Abort ( msg) => return Err ( LicenseError :: Parse ( msg) ) ,
96
128
Re ( _) | ReEsc ( _) => {
97
- return Err ( format ! (
129
+ return Err ( LicenseError :: Parse ( format ! (
98
130
"escape or balance opening brace on l. {}" ,
99
131
parser. open_brace_line
100
- ) ) ;
132
+ ) ) ) ;
133
+ }
134
+ LitEsc => {
135
+ return Err ( LicenseError :: Parse ( format ! (
136
+ "incomplete escape sequence on l. {}" ,
137
+ parser. linum
138
+ ) ) )
101
139
}
102
- LitEsc => return Err ( format ! ( "incomplete escape sequence on l. {}" , parser. linum) ) ,
103
140
_ => ( ) ,
104
141
}
105
142
parser. parsed . push_str ( & regex:: escape ( & parser. buffer ) ) ;
@@ -198,16 +235,22 @@ mod test {
198
235
r"^unbalanced nested braces \{{3}"
199
236
) ;
200
237
assert_eq ! (
201
- TemplateParser :: parse( "parsing error }" ) . unwrap_err( ) ,
202
- "escape or balance closing brace on l. 1"
238
+ & TemplateParser :: parse( "parsing error }" )
239
+ . unwrap_err( )
240
+ . to_string( ) ,
241
+ "parsing failed, escape or balance closing brace on l. 1"
203
242
) ;
204
243
assert_eq ! (
205
- TemplateParser :: parse( "parsing error {\n second line" ) . unwrap_err( ) ,
206
- "escape or balance opening brace on l. 1"
244
+ & TemplateParser :: parse( "parsing error {\n second line" )
245
+ . unwrap_err( )
246
+ . to_string( ) ,
247
+ "parsing failed, escape or balance opening brace on l. 1"
207
248
) ;
208
249
assert_eq ! (
209
- TemplateParser :: parse( r"parsing error \" ) . unwrap_err( ) ,
210
- "incomplete escape sequence on l. 1"
250
+ & TemplateParser :: parse( r"parsing error \" )
251
+ . unwrap_err( )
252
+ . to_string( ) ,
253
+ "parsing failed, incomplete escape sequence on l. 1"
211
254
) ;
212
255
}
213
256
}
0 commit comments