manger/
impls.rs

1use crate::Consumable;
2use crate::ConsumeError;
3
4impl<T: Consumable> Consumable for Option<T> {
5    fn consume_from(source: &str) -> Result<(Option<T>, &str), ConsumeError> {
6        Ok(match <T>::consume_from(source) {
7            Err(_) => (None, source),
8            Ok((item, unconsumed)) => (Some(item), unconsumed),
9        })
10    }
11}
12
13impl<T: Consumable> Consumable for Box<T> {
14    fn consume_from(s: &str) -> Result<(Box<T>, &str), ConsumeError> {
15        <T>::consume_from(s).map(|(item, unconsumed)| (Box::new(item), unconsumed))
16    }
17}
18
19impl<T: Consumable> Consumable for Vec<T> {
20    fn consume_from(s: &str) -> Result<(Vec<T>, &str), ConsumeError> {
21        let mut sequence = Vec::new();
22        let mut last_unconsumed = s;
23
24        while let Ok((extra_coordinate_pair, unconsumed)) = T::consume_from(last_unconsumed) {
25            sequence.push(extra_coordinate_pair);
26            last_unconsumed = unconsumed;
27        }
28
29        Ok((sequence, last_unconsumed))
30    }
31}
32
33use crate::ConsumeSource;
34
35macro_rules! consume_concat {
36    ( $( $type_ident:ident ),+ ) => {
37        impl<$( $type_ident ),+> Consumable for ($( $type_ident ),+)
38        where
39            $( $type_ident: Consumable ),+
40        {
41            fn consume_from(source: &str) -> Result<(Self, &str), ConsumeError> {
42                let mut unconsumed = source;
43                let mut offset = 0;
44
45                Ok(
46                    (
47                        (
48                            $(
49                                unconsumed
50                                    .mut_consume_by::<$type_ident>()
51                                    .map_err( |err| { err.offset(offset) } )
52                                    .map( |(item, by)| { offset += by; item } )?
53                            ),+
54                        ),
55                        unconsumed
56                    )
57                )
58            }
59        }
60    };
61}
62
63consume_concat!(A, B);
64consume_concat!(A, B, C);
65consume_concat!(A, B, C, D);
66consume_concat!(A, B, C, D, E);
67consume_concat!(A, B, C, D, E, F);
68consume_concat!(A, B, C, D, E, F, G);
69consume_concat!(A, B, C, D, E, F, G, H);
70consume_concat!(A, B, C, D, E, F, G, H, I);
71consume_concat!(A, B, C, D, E, F, G, H, I, J);