Skip to content

Commit 7c150b5

Browse files
committed
Usize1, Chars, Bytes
1 parent 19ec72e commit 7c150b5

File tree

1 file changed

+62
-0
lines changed

1 file changed

+62
-0
lines changed

libs/scanner/src/lib.rs

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,16 @@ where
9898
///
9999
/// For direct token scanning, see [`Scanner::scan()`].
100100
///
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+
///
101107
/// # Examples
102108
///
109+
/// ## Basic usage
110+
///
103111
/// ```
104112
/// use scanner::{Scanner, scan};
105113
///
@@ -114,6 +122,26 @@ where
114122
/// assert_eq!((n, k), (3, 10));
115123
/// assert_eq!(a, vec![1, 2, 3]);
116124
/// ```
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+
/// ```
117145
#[macro_export]
118146
macro_rules! scan {
119147
(via $scanner:expr, $($rest:tt)*) => {
@@ -152,6 +180,18 @@ macro_rules! scan_inner {
152180
::std::iter::repeat_with(|| $crate::scan_inner!(via $scanner, $t)).take($len).collect::<Vec<_>>()
153181
};
154182

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+
155195
// i32
156196
(via $scanner:expr, $ty:ty) => {
157197
$scanner.scan::<$ty>()
@@ -200,4 +240,26 @@ d 4
200240
assert_eq!(a, vec![1, 2, 3]);
201241
assert_eq!(queries, vec![('a', 1), ('b', 2), ('c', 3), ('d', 4)]);
202242
}
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+
}
203265
}

0 commit comments

Comments
 (0)