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 {
@@ -78,9 +77,8 @@ impl From<i32> for Number {
78
77
}
79
78
}
80
79
81
- pub fn directives < ' a , T > ( input : & mut TokenStream < ' a > )
82
- -> ParseResult < Vec < Directive < ' a , T > > , TokenStream < ' a > >
83
- where T : Text < ' a > ,
80
+ pub fn directives < ' a , T > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Vec < Directive < ' a , T > > , TokenStream < ' a > >
81
+ where T : Text < ' a > ,
84
82
{
85
83
many ( position ( )
86
84
. skip ( punct ( "@" ) )
@@ -89,11 +87,10 @@ pub fn directives<'a, T>(input: &mut TokenStream<'a>)
89
87
. map ( |( ( position, name) , arguments) | {
90
88
Directive { position, name, arguments }
91
89
} ) )
92
- . parse_stream ( input)
90
+ . parse_stream ( input) . into ( )
93
91
}
94
92
95
- pub fn arguments < ' a , T > ( input : & mut TokenStream < ' a > )
96
- -> ParseResult < Vec < ( T :: Value , Value < ' a , T > ) > , TokenStream < ' a > >
93
+ pub fn arguments < ' a , T > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Vec < ( T :: Value , Value < ' a , T > ) > , TokenStream < ' a > >
97
94
where T : Text < ' a > ,
98
95
{
99
96
optional (
@@ -105,25 +102,23 @@ pub fn arguments<'a, T>(input: &mut TokenStream<'a>)
105
102
. map ( |opt| {
106
103
opt. unwrap_or_else ( Vec :: new)
107
104
} )
108
- . parse_stream ( input)
105
+ . parse_stream ( input) . into ( )
109
106
}
110
107
111
- pub fn int_value < ' a , S > ( input : & mut TokenStream < ' a > )
112
- -> ParseResult < Value < ' a , S > , TokenStream < ' a > >
108
+ pub fn int_value < ' a , S > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Value < ' a , S > , TokenStream < ' a > >
113
109
where S : Text < ' a >
114
110
{
115
111
kind ( T :: IntValue ) . and_then ( |tok| tok. value . parse ( ) )
116
112
. map ( Number ) . map ( Value :: Int )
117
- . parse_stream ( input)
113
+ . parse_stream ( input) . into ( )
118
114
}
119
115
120
- pub fn float_value < ' a , S > ( input : & mut TokenStream < ' a > )
121
- -> ParseResult < Value < ' a , S > , TokenStream < ' a > >
116
+ pub fn float_value < ' a , S > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Value < ' a , S > , TokenStream < ' a > >
122
117
where S : Text < ' a >
123
118
{
124
119
kind ( T :: FloatValue ) . and_then ( |tok| tok. value . parse ( ) )
125
120
. map ( Value :: Float )
126
- . parse_stream ( input)
121
+ . parse_stream ( input) . into ( )
127
122
}
128
123
129
124
fn unquote_block_string < ' a > ( src : & ' a str ) -> Result < String , Error < Token < ' a > , Token < ' a > > > {
@@ -162,7 +157,7 @@ fn unquote_block_string<'a>(src: &'a str) -> Result<String, Error<Token<'a>, Tok
162
157
Ok ( result)
163
158
}
164
159
165
- fn unquote_string < ' a > ( s : & ' a str ) -> Result < String , Error < Token , Token > >
160
+ fn unquote_string < ' a > ( s : & ' a str ) -> Result < String , Error < Token , Token > >
166
161
{
167
162
let mut res = String :: with_capacity ( s. len ( ) ) ;
168
163
debug_assert ! ( s. starts_with( '"' ) && s. ends_with( '"' ) ) ;
@@ -183,7 +178,7 @@ fn unquote_string<'a>(s: &'a str) -> Result<String, Error<Token, Token>>
183
178
for _ in 0 ..4 {
184
179
match chars. next ( ) {
185
180
Some ( inner_c) => temp_code_point. push ( inner_c) ,
186
- None => return Err ( Error :: unexpected_message (
181
+ None => return Err ( Error :: unexpected_format (
187
182
format_args ! ( "\\ u must have 4 characters after it, only found '{}'" , temp_code_point)
188
183
) ) ,
189
184
}
@@ -193,13 +188,13 @@ fn unquote_string<'a>(s: &'a str) -> Result<String, Error<Token, Token>>
193
188
match u32:: from_str_radix ( & temp_code_point, 16 ) . map ( std:: char:: from_u32) {
194
189
Ok ( Some ( unicode_char) ) => res. push ( unicode_char) ,
195
190
_ => {
196
- return Err ( Error :: unexpected_message (
191
+ return Err ( Error :: unexpected_format (
197
192
format_args ! ( "{} is not a valid unicode code point" , temp_code_point) ) )
198
193
}
199
194
}
200
195
} ,
201
196
c => {
202
- return Err ( Error :: unexpected_message (
197
+ return Err ( Error :: unexpected_format (
203
198
format_args ! ( "bad escaped char {:?}" , c) ) ) ;
204
199
}
205
200
}
@@ -211,35 +206,31 @@ fn unquote_string<'a>(s: &'a str) -> Result<String, Error<Token, Token>>
211
206
Ok ( res)
212
207
}
213
208
214
- pub fn string < ' a > ( input : & mut TokenStream < ' a > )
215
- -> ParseResult < String , TokenStream < ' a > >
209
+ pub fn string < ' a > ( input : & mut TokenStream < ' a > ) -> StdParseResult < String , TokenStream < ' a > >
216
210
{
217
211
choice ( (
218
212
kind ( T :: StringValue ) . and_then ( |tok| unquote_string ( tok. value ) ) ,
219
213
kind ( T :: BlockString ) . and_then ( |tok| unquote_block_string ( tok. value ) ) ,
220
- ) ) . parse_stream ( input)
214
+ ) ) . parse_stream ( input) . into ( )
221
215
}
222
216
223
- pub fn string_value < ' a , S > ( input : & mut TokenStream < ' a > )
224
- -> ParseResult < Value < ' a , S > , TokenStream < ' a > >
217
+ pub fn string_value < ' a , S > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Value < ' a , S > , TokenStream < ' a > >
225
218
where S : Text < ' a > ,
226
219
{
227
220
kind ( T :: StringValue ) . and_then ( |tok| unquote_string ( tok. value ) )
228
221
. map ( Value :: String )
229
- . parse_stream ( input)
222
+ . parse_stream ( input) . into ( )
230
223
}
231
224
232
- pub fn block_string_value < ' a , S > ( input : & mut TokenStream < ' a > )
233
- -> ParseResult < Value < ' a , S > , TokenStream < ' a > >
225
+ pub fn block_string_value < ' a , S > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Value < ' a , S > , TokenStream < ' a > >
234
226
where S : Text < ' a > ,
235
227
{
236
228
kind ( T :: BlockString ) . and_then ( |tok| unquote_block_string ( tok. value ) )
237
229
. map ( Value :: String )
238
- . parse_stream ( input)
230
+ . parse_stream ( input) . into ( )
239
231
}
240
232
241
- pub fn plain_value < ' a , T > ( input : & mut TokenStream < ' a > )
242
- -> ParseResult < Value < ' a , T > , TokenStream < ' a > >
233
+ pub fn plain_value < ' a , T > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Value < ' a , T > , TokenStream < ' a > >
243
234
where T : Text < ' a > ,
244
235
{
245
236
ident ( "true" ) . map ( |_| Value :: Boolean ( true ) )
@@ -250,11 +241,10 @@ pub fn plain_value<'a, T>(input: &mut TokenStream<'a>)
250
241
. or ( parser ( float_value) )
251
242
. or ( parser ( string_value) )
252
243
. or ( parser ( block_string_value) )
253
- . parse_stream ( input)
244
+ . parse_stream ( input) . into ( )
254
245
}
255
246
256
- pub fn value < ' a , T > ( input : & mut TokenStream < ' a > )
257
- -> ParseResult < Value < ' a , T > , TokenStream < ' a > >
247
+ pub fn value < ' a , T > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Value < ' a , T > , TokenStream < ' a > >
258
248
where T : Text < ' a > ,
259
249
{
260
250
parser ( plain_value)
@@ -265,11 +255,10 @@ pub fn value<'a, T>(input: &mut TokenStream<'a>)
265
255
. with ( many ( name :: < ' a , T > ( ) . skip ( punct ( ":" ) ) . and ( parser ( value) ) ) )
266
256
. skip ( punct ( "}" ) )
267
257
. map ( Value :: Object ) )
268
- . parse_stream ( input)
258
+ . parse_stream ( input) . into ( )
269
259
}
270
260
271
- pub fn default_value < ' a , T > ( input : & mut TokenStream < ' a > )
272
- -> ParseResult < Value < ' a , T > , TokenStream < ' a > >
261
+ pub fn default_value < ' a , T > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Value < ' a , T > , TokenStream < ' a > >
273
262
where T : Text < ' a > ,
274
263
{
275
264
parser ( plain_value)
@@ -279,11 +268,10 @@ pub fn default_value<'a, T>(input: &mut TokenStream<'a>)
279
268
. with ( many ( name :: < ' a , T > ( ) . skip ( punct ( ":" ) ) . and ( parser ( default_value) ) ) )
280
269
. skip ( punct ( "}" ) )
281
270
. map ( Value :: Object ) )
282
- . parse_stream ( input)
271
+ . parse_stream ( input) . into ( )
283
272
}
284
273
285
- pub fn parse_type < ' a , T > ( input : & mut TokenStream < ' a > )
286
- -> ParseResult < Type < ' a , T > , TokenStream < ' a > >
274
+ pub fn parse_type < ' a , T > ( input : & mut TokenStream < ' a > ) -> StdParseResult < Type < ' a , T > , TokenStream < ' a > >
287
275
where T : Text < ' a > ,
288
276
{
289
277
name :: < ' a , T > ( ) . map ( Type :: NamedType )
@@ -300,7 +288,7 @@ pub fn parse_type<'a, T>(input: &mut TokenStream<'a>)
300
288
typ
301
289
}
302
290
)
303
- . parse_stream ( input)
291
+ . parse_stream ( input) . into ( )
304
292
}
305
293
306
294
#[ cfg( test) ]
0 commit comments