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}