rust_releases_core/
index.rs

1use crate::release::Release;
2use crate::Source;
3use std::iter::FromIterator;
4
5/// A release index is a data structure holding known Rust releases.
6///
7/// # Ordering contract
8///
9/// Releases must be ordered from the newest to the oldest known release.
10#[derive(Debug)]
11pub struct ReleaseIndex {
12    index: Vec<Release>,
13}
14
15impl ReleaseIndex {
16    /// Create a new `ReleaseIndex` from a given source.
17    /// Releases available in the index may vary based on the type of `Source`.
18    pub fn from_source<S: Source>(source: S) -> Result<Self, <S as Source>::Error> {
19        source.build_index()
20    }
21
22    /// Returns a slice of releases.
23    pub fn releases(&self) -> &[Release] {
24        &self.index
25    }
26
27    /// Returns the most recent release.
28    ///
29    /// Returns `None` if the index has not registered any release.
30    pub fn most_recent(&self) -> Option<&Release> {
31        self.index.first()
32    }
33
34    /// Returns the least recent (oldest) registered release.
35    ///
36    /// Returns `None` if the index has not registered any release.
37    pub fn least_recent(&self) -> Option<&Release> {
38        self.index.last()
39    }
40}
41
42impl FromIterator<Release> for ReleaseIndex {
43    /// Create a new `ReleaseIndex` from a given iterable.
44    ///
45    /// NB: Releases should already be sorted from the most recent to the least recent release.
46    fn from_iter<T: IntoIterator<Item = Release>>(iter: T) -> Self {
47        Self {
48            index: iter.into_iter().collect(),
49        }
50    }
51}