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
use hwdb; use jobset; use std::collections::{BTreeMap, BTreeSet, HashMap, HashSet}; use std::hash::Hash; use std::sync::Arc; use Uuid; pub trait MayBeSkipped { fn may_be_skipped(&self) -> bool; } pub trait MustNotBeSkipped {} impl<T: MustNotBeSkipped> MayBeSkipped for T { fn may_be_skipped(&self) -> bool { false } } impl MustNotBeSkipped for hwdb::Module {} impl MustNotBeSkipped for hwdb::HardwareBoardDescription {} impl MustNotBeSkipped for jobset::JobSet {} impl MayBeSkipped for () { fn may_be_skipped(&self) -> bool { true } } impl<T> MayBeSkipped for Option<T> { fn may_be_skipped(&self) -> bool { self.is_none() } } impl<T> MayBeSkipped for Vec<T> { fn may_be_skipped(&self) -> bool { self.is_empty() } } impl<T, U> MayBeSkipped for BTreeMap<T, U> { fn may_be_skipped(&self) -> bool { self.is_empty() } } impl<T> MayBeSkipped for BTreeSet<T> { fn may_be_skipped(&self) -> bool { self.is_empty() } } impl<T: Eq + Hash, U> MayBeSkipped for HashMap<T, U> { fn may_be_skipped(&self) -> bool { self.is_empty() } } impl<T: Eq + Hash> MayBeSkipped for HashSet<T> { fn may_be_skipped(&self) -> bool { self.is_empty() } } impl<T: MayBeSkipped> MayBeSkipped for Arc<T> { fn may_be_skipped(&self) -> bool { self.as_ref().may_be_skipped() } } impl MayBeSkipped for String { fn may_be_skipped(&self) -> bool { self.is_empty() } } impl MayBeSkipped for Uuid { fn may_be_skipped(&self) -> bool { false } }