1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
#![feature(test)] #[macro_use] extern crate lazy_static; pub mod trim; pub trait Prune: IsNone { fn prune(self) -> Self; } pub trait IsNone { fn is_none(&self) -> bool { false } } impl<T> IsNone for Option<T> { fn is_none(&self) -> bool { self.is_none() } } impl<T> Prune for Option<T> where T: Prune + IsNone, { fn prune(self) -> Self { match self { None => None, Some(s) => { let s = s.prune(); if s.is_none() { None } else { Some(s) } } } } } impl<T> IsNone for Vec<T> {} impl<T> Prune for Vec<T> where T: Prune, { fn prune(self) -> Self { self.into_iter().map(Prune::prune).collect() } } #[derive(Debug)] pub enum Operator { Trim, TrimStart, TrimEnd, NoWhitespace, Nested, Custom(String), } macro_rules! tuple_impls { ($( ($(($idx:tt)),+) )+) => { tuple_impls! { $( ($((T, $idx)),+) )+ } }; ($( ($(($T:ident, $idx:tt)),+) )+) => { $( impl<T> IsNone for ($($T),+) {} impl<T> Prune for ($($T),+) where T: Prune { fn prune(self) -> Self { ( $(self.$idx.prune()),+ ) } } )+ }; } tuple_impls! { ((0), (1)) ((0), (1), (2)) ((0), (1), (2), (3)) ((0), (1), (2), (3), (4)) ((0), (1), (2), (3), (4), (5)) ((0), (1), (2), (3), (4), (5), (6)) ((0), (1), (2), (3), (4), (5), (6), (7)) ((0), (1), (2), (3), (4), (5), (6), (7), (8)) ((0), (1), (2), (3), (4), (5), (6), (7), (8), (9)) ((0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)) ((0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11)) ((0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) }