use std::borrow::Borrow;
use std::iter::FromIterator;
use trailer::accumulation::{AccumulationPolicy, SingleAccumulator, ValueAccumulator};
#[derive(Clone)]
pub struct TrailerSpec<'k> {
pub key: &'k str,
pub accumulation: AccumulationPolicy,
}
impl<'k> TrailerSpec<'k> {
pub fn single_accumulator(&self) -> SingleAccumulator {
SingleAccumulator::new(self.key.to_string(), self.accumulation.clone())
}
}
pub const ISSUE_TYPE_SPEC: TrailerSpec = TrailerSpec {
key: "Dit-type",
accumulation: AccumulationPolicy::Latest,
};
pub const ISSUE_STATUS_SPEC: TrailerSpec = TrailerSpec {
key: "Dit-status",
accumulation: AccumulationPolicy::Latest,
};
pub trait ToMap {
type Output: FromIterator<(String, ValueAccumulator)>;
fn into_map(self) -> Self::Output;
}
impl<'s, I, J> ToMap for I
where I: IntoIterator<Item = J>,
J: Borrow<TrailerSpec<'s>>
{
type Output = ::std::collections::HashMap<String, ValueAccumulator>;
fn into_map(self) -> Self::Output {
self.into_iter()
.map(|spec| {
let s = spec.borrow();
(s.key.to_string(), ValueAccumulator::from(s.accumulation.clone()))
})
.collect()
}
}