diff --git a/examples/vector_extension/Cargo.toml b/examples/vector_extension/Cargo.toml index 839239b..3af7994 100644 --- a/examples/vector_extension/Cargo.toml +++ b/examples/vector_extension/Cargo.toml @@ -8,8 +8,8 @@ version.workspace = true [dependencies] anyhow = { workspace = true } indoc = { workspace = true } -postgresql_extensions = { path = "../../postgresql_extensions" } postgresql_embedded = { path = "../../postgresql_embedded" } +postgresql_extensions = { path = "../../postgresql_extensions" } sqlx = { workspace = true, features = ["runtime-tokio"] } tracing = { workspace = true } tracing-subscriber = { workspace = true } diff --git a/postgresql_extensions/src/error.rs b/postgresql_extensions/src/error.rs index 00aabd6..0174adb 100644 --- a/postgresql_extensions/src/error.rs +++ b/postgresql_extensions/src/error.rs @@ -6,10 +6,13 @@ pub type Result = core::result::Result; pub enum Error { /// Archive error #[error(transparent)] - ArchiveFound(#[from] postgresql_archive::Error), + ArchiveError(#[from] postgresql_archive::Error), /// Error when a command fails #[error(transparent)] CommandError(#[from] postgresql_commands::Error), + /// Extension not found + #[error("extension not found '{0}'")] + ExtensionNotFound(String), /// Error when an IO operation fails #[error(transparent)] IoError(#[from] std::io::Error), diff --git a/postgresql_extensions/src/repository/steampipe/repository.rs b/postgresql_extensions/src/repository/steampipe/repository.rs index f9b9a19..1f15b31 100644 --- a/postgresql_extensions/src/repository/steampipe/repository.rs +++ b/postgresql_extensions/src/repository/steampipe/repository.rs @@ -1,6 +1,7 @@ use crate::model::AvailableExtension; use crate::repository::steampipe::URL; use crate::repository::{steampipe, Repository}; +use crate::Error::ExtensionNotFound; use crate::Result; use async_trait::async_trait; use flate2::bufread::GzDecoder; @@ -67,7 +68,14 @@ impl Repository for Steampipe { name: &str, version: &VersionReq, ) -> Result<(Version, Vec)> { - let url = format!("{URL}/steampipe-plugin-{name}?postgresql_version={postgresql_version}"); + let Some(extension) = steampipe::extensions::get() + .iter() + .find(|extension| extension.name == name) + else { + let extension = format!("{}:{}:{}", self.name(), name, version); + return Err(ExtensionNotFound(extension)); + }; + let url = format!("{}?postgresql_version={postgresql_version}", extension.url); let archive = get_archive(url.as_str(), version).await?; Ok(archive) } @@ -120,7 +128,7 @@ mod tests { } #[tokio::test] - async fn test_get_extensions() -> Result<()> { + async fn test_get_available_extensions() -> Result<()> { let repository = Steampipe; let extensions = repository.get_available_extensions().await?; let extension = &extensions[0]; @@ -133,4 +141,17 @@ mod tests { assert_eq!(143, extensions.len()); Ok(()) } + + #[tokio::test] + async fn test_get_archive_error() -> anyhow::Result<()> { + let repository = Steampipe; + let postgresql_version = "15.7"; + let name = "does-not-exist"; + let version = VersionReq::parse("=0.12.0")?; + let result = repository + .get_archive(postgresql_version, name, &version) + .await; + assert!(result.is_err()); + Ok(()) + } }