///|
pub(all) suberror RegistryIndexError {
  InvalidJson
  MissingVersion
} derive(Eq, Show)

///|
pub(all) suberror VersionSelectError {
  InvalidLatest(String)
  InvalidRequested(String)
} derive(Eq, Show)

///|
pub fn parse_registry_latest_version(
  content : String,
) -> Result[String, RegistryIndexError] {
  let json = @json.parse(content) catch {
    _ => return Err(RegistryIndexError::InvalidJson)
  }
  match json {
    Json::Object(obj) =>
      match obj.get("version") {
        Some(Json::String(value)) => Ok(value)
        _ => Err(RegistryIndexError::MissingVersion)
      }
    _ => Err(RegistryIndexError::InvalidJson)
  }
}

///|
pub fn select_version(
  requested : String?,
  latest : String,
) -> Result[String, VersionSelectError] {
  match @semver.try_parse(latest) {
    Ok(_) => ()
    Err(_) => return Err(VersionSelectError::InvalidLatest(latest))
  }
  match requested {
    Some(value) =>
      match @semver.try_parse(value) {
        Ok(_) => Ok(value)
        Err(_) => Err(VersionSelectError::InvalidRequested(value))
      }
    None => Ok(latest)
  }
}