98
98
///
99
99
/// For direct token scanning, see [`Scanner::scan()`].
100
100
///
101
+ /// # Special Types
102
+ ///
103
+ /// - `Usize1`: Converts 1-indexed input to 0-indexed (subtracts 1)
104
+ /// - `Chars`: Reads a string and converts it to `Vec<char>`
105
+ /// - `Bytes`: Reads a string and converts it to `Vec<u8>`
106
+ ///
101
107
/// # Examples
102
108
///
109
+ /// ## Basic usage
110
+ ///
103
111
/// ```
104
112
/// use scanner::{Scanner, scan};
105
113
///
@@ -114,6 +122,26 @@ where
114
122
/// assert_eq!((n, k), (3, 10));
115
123
/// assert_eq!(a, vec![1, 2, 3]);
116
124
/// ```
125
+ ///
126
+ /// ## Special types
127
+ ///
128
+ /// ```
129
+ /// use scanner::{Scanner, scan};
130
+ ///
131
+ /// let mut scanner = Scanner::cursor("5\n1 3\nabcde\nABCDE");
132
+ ///
133
+ /// scan! {
134
+ /// via scanner,
135
+ /// n: usize,
136
+ /// (l, r): (Usize1, Usize1),
137
+ /// s: Chars,
138
+ /// t: Bytes,
139
+ /// };
140
+ ///
141
+ /// assert_eq!((l, r), (0, 2));
142
+ /// assert_eq!(s, vec!['a', 'b', 'c', 'd', 'e']);
143
+ /// assert_eq!(t, vec![b'A', b'B', b'C', b'D', b'E']);
144
+ /// ```
117
145
#[ macro_export]
118
146
macro_rules! scan {
119
147
( via $scanner: expr, $( $rest: tt) * ) => {
@@ -152,6 +180,18 @@ macro_rules! scan_inner {
152
180
:: std:: iter:: repeat_with( || $crate:: scan_inner!( via $scanner, $t) ) . take( $len) . collect:: <Vec <_>>( )
153
181
} ;
154
182
183
+ ( via $scanner: expr, Usize1 ) => {
184
+ $scanner. scan:: <usize >( ) . checked_sub( 1 ) . expect( "Usize1: input was 0, expected >= 1" )
185
+ } ;
186
+
187
+ ( via $scanner: expr, Chars ) => {
188
+ $scanner. scan:: <String >( ) . chars( ) . collect:: <Vec <_>>( )
189
+ } ;
190
+
191
+ ( via $scanner: expr, Bytes ) => {
192
+ $scanner. scan:: <String >( ) . bytes( ) . collect:: <Vec <_>>( )
193
+ } ;
194
+
155
195
// i32
156
196
( via $scanner: expr, $ty: ty) => {
157
197
$scanner. scan:: <$ty>( )
200
240
assert_eq ! ( a, vec![ 1 , 2 , 3 ] ) ;
201
241
assert_eq ! ( queries, vec![ ( 'a' , 1 ) , ( 'b' , 2 ) , ( 'c' , 3 ) , ( 'd' , 4 ) ] ) ;
202
242
}
243
+
244
+ #[ test]
245
+ fn test_special_type ( ) {
246
+ let mut scanner = Scanner :: cursor (
247
+ r#"
248
+ 1 10
249
+ abc
250
+ XYZ
251
+ "# ,
252
+ ) ;
253
+
254
+ scan ! {
255
+ via scanner,
256
+ ( l, r) : ( Usize1 , Usize1 ) ,
257
+ s: Chars ,
258
+ t: Bytes ,
259
+ } ;
260
+
261
+ assert_eq ! ( ( l, r) , ( 0 , 9 ) ) ;
262
+ assert_eq ! ( s, vec![ 'a' , 'b' , 'c' ] ) ;
263
+ assert_eq ! ( t, vec![ b'X' , b'Y' , b'Z' ] ) ;
264
+ }
203
265
}
0 commit comments