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
use crate::release::Release;
use crate::Source;
use std::iter::FromIterator;
/// A release index is a data structure holding known Rust releases.
///
/// # Ordering contract
///
/// Releases must be ordered from the newest to the oldest known release.
#[derive(Debug)]
pub struct ReleaseIndex {
index: Vec<Release>,
}
impl ReleaseIndex {
/// Create a new `ReleaseIndex` from a given source.
/// Releases available in the index may vary based on the type of `Source`.
pub fn from_source<S: Source>(source: S) -> Result<Self, <S as Source>::Error> {
source.build_index()
}
/// Returns a slice of releases.
pub fn releases(&self) -> &[Release] {
&self.index
}
/// Returns the most recent release.
///
/// Returns `None` if the index has not registered any release.
pub fn most_recent(&self) -> Option<&Release> {
self.index.first()
}
/// Returns the least recent (oldest) registered release.
///
/// Returns `None` if the index has not registered any release.
pub fn least_recent(&self) -> Option<&Release> {
self.index.last()
}
}
impl FromIterator<Release> for ReleaseIndex {
/// Create a new `ReleaseIndex` from a given iterable.
///
/// NB: Releases should already be sorted from the most recent to the least recent release.
fn from_iter<T: IntoIterator<Item = Release>>(iter: T) -> Self {
Self {
index: iter.into_iter().collect(),
}
}
}