|
1 |
| -use std::fmt::Debug; |
2 |
| -use std::str::FromStr; |
| 1 | +pub trait Integer: std::str::FromStr {} |
| 2 | +impl Integer for u8 {} |
| 3 | +impl Integer for u32 {} |
| 4 | +impl Integer for u64 {} |
| 5 | +impl Integer for usize {} |
| 6 | +impl Integer for i32 {} |
3 | 7 |
|
4 |
| -pub fn to<T>(s: &str) -> T |
5 |
| -where |
6 |
| - T: FromStr, |
7 |
| - <T as FromStr>::Err: Debug, |
8 |
| -{ |
9 |
| - s.parse().unwrap() |
| 8 | +pub fn to<T: Integer>(s: &str) -> T { |
| 9 | + match s.parse() { |
| 10 | + Ok(t) => t, |
| 11 | + Err(_) => panic!("Unable to parse \"{s}\""), |
| 12 | + } |
10 | 13 | }
|
11 | 14 |
|
12 | 15 | pub fn to_iter<'a, T>(s: &'a str) -> impl Iterator<Item = T> + 'a
|
13 |
| -where |
14 |
| - T: FromStr + 'a, |
15 |
| - <T as FromStr>::Err: Debug, |
| 16 | +where T: Integer + 'a |
16 | 17 | {
|
17 | 18 | s.split(not_numeric).filter(not_empty).map(to::<T>)
|
18 | 19 | }
|
19 | 20 |
|
20 |
| -pub fn to_vec<T>(s: &str) -> Vec<T> |
21 |
| -where |
22 |
| - T: FromStr, |
23 |
| - <T as FromStr>::Err: Debug, |
24 |
| -{ |
| 21 | +pub fn to_vec<T: Integer>(s: &str) -> Vec<T> { |
25 | 22 | to_iter(s).collect()
|
26 | 23 | }
|
27 | 24 |
|
28 |
| -pub fn to_array1<T>(s: &str) -> [T; 1] |
29 |
| -where |
30 |
| - T: FromStr, |
31 |
| - <T as FromStr>::Err: Debug, |
32 |
| -{ |
| 25 | +pub fn to_tuple_1<T: Integer>(s: &str) -> T { |
33 | 26 | let mut iter = to_iter(s);
|
34 |
| - [iter.next().unwrap()] |
| 27 | + iter.next().unwrap() |
35 | 28 | }
|
36 | 29 |
|
37 |
| -pub fn to_array2<T>(s: &str) -> [T; 2] |
38 |
| -where |
39 |
| - T: FromStr, |
40 |
| - <T as FromStr>::Err: Debug, |
41 |
| -{ |
| 30 | +pub fn to_tuple_2<T: Integer>(s: &str) -> (T, T) { |
42 | 31 | let mut iter = to_iter(s);
|
43 |
| - [iter.next().unwrap(), iter.next().unwrap()] |
| 32 | + (iter.next().unwrap(), iter.next().unwrap()) |
44 | 33 | }
|
45 | 34 |
|
46 |
| -pub fn to_array3<T>(s: &str) -> [T; 3] |
47 |
| -where |
48 |
| - T: FromStr, |
49 |
| - <T as FromStr>::Err: Debug, |
50 |
| -{ |
| 35 | +pub fn to_tuple_3<T: Integer>(s: &str) -> (T, T, T) { |
51 | 36 | let mut iter = to_iter(s);
|
52 |
| - [ |
| 37 | + ( |
53 | 38 | iter.next().unwrap(),
|
54 | 39 | iter.next().unwrap(),
|
55 | 40 | iter.next().unwrap(),
|
56 |
| - ] |
| 41 | + ) |
57 | 42 | }
|
58 | 43 |
|
59 |
| -pub fn to_array4<T>(s: &str) -> [T; 4] |
60 |
| -where |
61 |
| - T: FromStr, |
62 |
| - <T as FromStr>::Err: Debug, |
63 |
| -{ |
| 44 | +pub fn to_tuple_4<T: Integer>(s: &str) -> (T, T, T, T) { |
64 | 45 | let mut iter = to_iter(s);
|
65 |
| - [ |
| 46 | + ( |
66 | 47 | iter.next().unwrap(),
|
67 | 48 | iter.next().unwrap(),
|
68 | 49 | iter.next().unwrap(),
|
69 | 50 | iter.next().unwrap(),
|
70 |
| - ] |
| 51 | + ) |
71 | 52 | }
|
72 | 53 |
|
73 | 54 | fn not_numeric(c: char) -> bool {
|
|
0 commit comments