diff options
Diffstat (limited to 'src/launcher/version.rs')
| -rw-r--r-- | src/launcher/version.rs | 25 |
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) => |
