summaryrefslogtreecommitdiffstats
path: root/src/launcher/version.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/launcher/version.rs')
-rw-r--r--src/launcher/version.rs25
1 files changed, 24 insertions, 1 deletions
diff --git a/src/launcher/version.rs b/src/launcher/version.rs
index 08c3bb5..f4cdd6c 100644
--- a/src/launcher/version.rs
+++ b/src/launcher/version.rs
@@ -190,12 +190,31 @@ impl<'a, T: Into<VersionResult<'a>>> From<Option<T>> for VersionResult<'a> {
}
}
+#[derive(Debug)]
pub enum VersionResolveError {
- InheritanceLoop,
+ InheritanceLoop(String),
MissingVersion(String),
Unknown(Box<dyn Error>)
}
+impl Display for VersionResolveError {
+ fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
+ match self {
+ VersionResolveError::InheritanceLoop(s) => {
+ write!(f, "inheritance loop (saw {s} twice)")
+ },
+ VersionResolveError::MissingVersion(s) => {
+ write!(f, "unknown version {s}")
+ },
+ VersionResolveError::Unknown(err) => {
+ write!(f, "unknown error: {err}")
+ }
+ }
+ }
+}
+
+impl Error for VersionResolveError {}
+
impl VersionList {
pub async fn online(home: &Path) -> Result<VersionList, Box<dyn Error>> {
let remote = RemoteVersionList::new().await?;
@@ -262,6 +281,10 @@ impl VersionList {
let mut inherit = inherit.clone();
loop {
+ if seen.insert(inherit.clone()) {
+ return Err(VersionResolveError::InheritanceLoop(inherit));
+ }
+
let inherited_ver = match self.get_version_lazy(inherit.as_str()) {
VersionResult::Complete(v) => Cow::Borrowed(v),
VersionResult::Remote(v) =>