1
1
use std:: { fmt, collections:: BTreeMap } ;
2
2
3
- use combine:: { parser, ParseResult , Parser } ;
3
+ use combine:: { parser, StdParseResult , Parser , many , many1 , optional , position , choice } ;
4
4
use combine:: easy:: Error ;
5
5
use combine:: error:: StreamError ;
6
- use combine:: combinator:: { many, many1, optional, position, choice} ;
7
6
8
7
use crate :: tokenizer:: { Kind as T , Token , TokenStream } ;
9
8
use crate :: helpers:: { punct, ident, kind, name} ;
@@ -12,7 +11,7 @@ use crate::position::Pos;
12
11
/// Text abstracts over types that hold a string value.
13
12
/// It is used to make the AST generic over the string type.
14
13
pub trait Text < ' a > : ' a {
15
- type Value : ' a + From < & ' a str > + AsRef < str > + std:: borrow:: Borrow < str > + PartialEq + Eq + PartialOrd + Ord + fmt:: Debug + Clone ;
14
+ type Value : ' a + From < & ' a str > + AsRef < str > + std:: borrow:: Borrow < str > + PartialEq + Eq + PartialOrd + Ord + fmt:: Debug + Clone ;
16
15
}
17
16
18
17
impl < ' a > Text < ' a > for & ' a str {
@@ -98,9 +97,8 @@ impl From<i32> for Number {
98
97
}
99
98
}
100
99
101
- pub fn directives < ' a , T > ( input : & mut TokenStream < ' a > )
102
- -> ParseResult < Vec < Directive < ' a , T > > , TokenStream < ' a > >
103
- where T : Text < ' a > ,
100
+ pub fn directives < ' a , T > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Vec < Directive < ' a , T > > , TokenStream < ' a > >
101
+ where T : Text < ' a > ,
104
102
{
105
103
many ( position ( )
106
104
. skip ( punct ( "@" ) )
@@ -109,11 +107,10 @@ pub fn directives<'a, T>(input: &mut TokenStream<'a>)
109
107
. map ( |( ( position, name) , arguments) | {
110
108
Directive { position, name, arguments }
111
109
} ) )
112
- . parse_stream ( input)
110
+ . parse_stream ( input) . into ( )
113
111
}
114
112
115
- pub fn arguments < ' a , T > ( input : & mut TokenStream < ' a > )
116
- -> ParseResult < Vec < ( T :: Value , Value < ' a , T > ) > , TokenStream < ' a > >
113
+ pub fn arguments < ' a , T > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Vec < ( T :: Value , Value < ' a , T > ) > , TokenStream < ' a > >
117
114
where T : Text < ' a > ,
118
115
{
119
116
optional (
@@ -125,25 +122,23 @@ pub fn arguments<'a, T>(input: &mut TokenStream<'a>)
125
122
. map ( |opt| {
126
123
opt. unwrap_or_else ( Vec :: new)
127
124
} )
128
- . parse_stream ( input)
125
+ . parse_stream ( input) . into ( )
129
126
}
130
127
131
- pub fn int_value < ' a , S > ( input : & mut TokenStream < ' a > )
132
- -> ParseResult < Value < ' a , S > , TokenStream < ' a > >
128
+ pub fn int_value < ' a , S > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Value < ' a , S > , TokenStream < ' a > >
133
129
where S : Text < ' a >
134
130
{
135
131
kind ( T :: IntValue ) . and_then ( |tok| tok. value . parse ( ) )
136
132
. map ( Number ) . map ( Value :: Int )
137
- . parse_stream ( input)
133
+ . parse_stream ( input) . into ( )
138
134
}
139
135
140
- pub fn float_value < ' a , S > ( input : & mut TokenStream < ' a > )
141
- -> ParseResult < Value < ' a , S > , TokenStream < ' a > >
136
+ pub fn float_value < ' a , S > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Value < ' a , S > , TokenStream < ' a > >
142
137
where S : Text < ' a >
143
138
{
144
139
kind ( T :: FloatValue ) . and_then ( |tok| tok. value . parse ( ) )
145
140
. map ( Value :: Float )
146
- . parse_stream ( input)
141
+ . parse_stream ( input) . into ( )
147
142
}
148
143
149
144
fn unquote_block_string < ' a > ( src : & ' a str ) -> Result < String , Error < Token < ' a > , Token < ' a > > > {
@@ -182,7 +177,7 @@ fn unquote_block_string<'a>(src: &'a str) -> Result<String, Error<Token<'a>, Tok
182
177
Ok ( result)
183
178
}
184
179
185
- fn unquote_string < ' a > ( s : & ' a str ) -> Result < String , Error < Token , Token > >
180
+ fn unquote_string < ' a > ( s : & ' a str ) -> Result < String , Error < Token , Token > >
186
181
{
187
182
let mut res = String :: with_capacity ( s. len ( ) ) ;
188
183
debug_assert ! ( s. starts_with( '"' ) && s. ends_with( '"' ) ) ;
@@ -203,7 +198,7 @@ fn unquote_string<'a>(s: &'a str) -> Result<String, Error<Token, Token>>
203
198
for _ in 0 ..4 {
204
199
match chars. next ( ) {
205
200
Some ( inner_c) => temp_code_point. push ( inner_c) ,
206
- None => return Err ( Error :: unexpected_message (
201
+ None => return Err ( Error :: unexpected_format (
207
202
format_args ! ( "\\ u must have 4 characters after it, only found '{}'" , temp_code_point)
208
203
) ) ,
209
204
}
@@ -213,13 +208,13 @@ fn unquote_string<'a>(s: &'a str) -> Result<String, Error<Token, Token>>
213
208
match u32:: from_str_radix ( & temp_code_point, 16 ) . map ( std:: char:: from_u32) {
214
209
Ok ( Some ( unicode_char) ) => res. push ( unicode_char) ,
215
210
_ => {
216
- return Err ( Error :: unexpected_message (
211
+ return Err ( Error :: unexpected_format (
217
212
format_args ! ( "{} is not a valid unicode code point" , temp_code_point) ) )
218
213
}
219
214
}
220
215
} ,
221
216
c => {
222
- return Err ( Error :: unexpected_message (
217
+ return Err ( Error :: unexpected_format (
223
218
format_args ! ( "bad escaped char {:?}" , c) ) ) ;
224
219
}
225
220
}
@@ -231,35 +226,31 @@ fn unquote_string<'a>(s: &'a str) -> Result<String, Error<Token, Token>>
231
226
Ok ( res)
232
227
}
233
228
234
- pub fn string < ' a > ( input : & mut TokenStream < ' a > )
235
- -> ParseResult < String , TokenStream < ' a > >
229
+ pub fn string < ' a > ( input : & mut TokenStream < ' a > ) -> StdParseResult < String , TokenStream < ' a > >
236
230
{
237
231
choice ( (
238
232
kind ( T :: StringValue ) . and_then ( |tok| unquote_string ( tok. value ) ) ,
239
233
kind ( T :: BlockString ) . and_then ( |tok| unquote_block_string ( tok. value ) ) ,
240
- ) ) . parse_stream ( input)
234
+ ) ) . parse_stream ( input) . into ( )
241
235
}
242
236
243
- pub fn string_value < ' a , S > ( input : & mut TokenStream < ' a > )
244
- -> ParseResult < Value < ' a , S > , TokenStream < ' a > >
237
+ pub fn string_value < ' a , S > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Value < ' a , S > , TokenStream < ' a > >
245
238
where S : Text < ' a > ,
246
239
{
247
240
kind ( T :: StringValue ) . and_then ( |tok| unquote_string ( tok. value ) )
248
241
. map ( Value :: String )
249
- . parse_stream ( input)
242
+ . parse_stream ( input) . into ( )
250
243
}
251
244
252
- pub fn block_string_value < ' a , S > ( input : & mut TokenStream < ' a > )
253
- -> ParseResult < Value < ' a , S > , TokenStream < ' a > >
245
+ pub fn block_string_value < ' a , S > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Value < ' a , S > , TokenStream < ' a > >
254
246
where S : Text < ' a > ,
255
247
{
256
248
kind ( T :: BlockString ) . and_then ( |tok| unquote_block_string ( tok. value ) )
257
249
. map ( Value :: String )
258
- . parse_stream ( input)
250
+ . parse_stream ( input) . into ( )
259
251
}
260
252
261
- pub fn plain_value < ' a , T > ( input : & mut TokenStream < ' a > )
262
- -> ParseResult < Value < ' a , T > , TokenStream < ' a > >
253
+ pub fn plain_value < ' a , T > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Value < ' a , T > , TokenStream < ' a > >
263
254
where T : Text < ' a > ,
264
255
{
265
256
ident ( "true" ) . map ( |_| Value :: Boolean ( true ) )
@@ -270,11 +261,10 @@ pub fn plain_value<'a, T>(input: &mut TokenStream<'a>)
270
261
. or ( parser ( float_value) )
271
262
. or ( parser ( string_value) )
272
263
. or ( parser ( block_string_value) )
273
- . parse_stream ( input)
264
+ . parse_stream ( input) . into ( )
274
265
}
275
266
276
- pub fn value < ' a , T > ( input : & mut TokenStream < ' a > )
277
- -> ParseResult < Value < ' a , T > , TokenStream < ' a > >
267
+ pub fn value < ' a , T > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Value < ' a , T > , TokenStream < ' a > >
278
268
where T : Text < ' a > ,
279
269
{
280
270
parser ( plain_value)
@@ -285,11 +275,10 @@ pub fn value<'a, T>(input: &mut TokenStream<'a>)
285
275
. with ( many ( name :: < ' a , T > ( ) . skip ( punct ( ":" ) ) . and ( parser ( value) ) ) )
286
276
. skip ( punct ( "}" ) )
287
277
. map ( Value :: Object ) )
288
- . parse_stream ( input)
278
+ . parse_stream ( input) . into ( )
289
279
}
290
280
291
- pub fn default_value < ' a , T > ( input : & mut TokenStream < ' a > )
292
- -> ParseResult < Value < ' a , T > , TokenStream < ' a > >
281
+ pub fn default_value < ' a , T > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Value < ' a , T > , TokenStream < ' a > >
293
282
where T : Text < ' a > ,
294
283
{
295
284
parser ( plain_value)
@@ -299,11 +288,10 @@ pub fn default_value<'a, T>(input: &mut TokenStream<'a>)
299
288
. with ( many ( name :: < ' a , T > ( ) . skip ( punct ( ":" ) ) . and ( parser ( default_value) ) ) )
300
289
. skip ( punct ( "}" ) )
301
290
. map ( Value :: Object ) )
302
- . parse_stream ( input)
291
+ . parse_stream ( input) . into ( )
303
292
}
304
293
305
- pub fn parse_type < ' a , T > ( input : & mut TokenStream < ' a > )
306
- -> ParseResult < Type < ' a , T > , TokenStream < ' a > >
294
+ pub fn parse_type < ' a , T > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Type < ' a , T > , TokenStream < ' a > >
307
295
where T : Text < ' a > ,
308
296
{
309
297
name :: < ' a , T > ( ) . map ( Type :: NamedType )
@@ -320,7 +308,7 @@ pub fn parse_type<'a, T>(input: &mut TokenStream<'a>)
320
308
typ
321
309
}
322
310
)
323
- . parse_stream ( input)
311
+ . parse_stream ( input) . into ( )
324
312
}
325
313
326
314
#[ cfg( test) ]
0 commit comments