diff --git a/Cargo.lock b/Cargo.lock index e054c15..d4ea897 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2015,7 +2015,7 @@ dependencies = [ "md-5", "num-format", "quick-xml", - "regex", + "regex-lite", "reqwest", "reqwest-middleware", "reqwest-retry", @@ -2077,7 +2077,7 @@ dependencies = [ "postgresql_archive", "postgresql_commands", "postgresql_embedded", - "regex", + "regex-lite", "reqwest", "semver", "serde", @@ -2316,6 +2316,12 @@ dependencies = [ "regex-syntax 0.8.5", ] +[[package]] +name = "regex-lite" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" + [[package]] name = "regex-syntax" version = "0.6.29" diff --git a/Cargo.toml b/Cargo.toml index a9db352..865b057 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -45,7 +45,7 @@ postgres = "0.19.9" quick-xml = "0.37.1" r2d2_postgres = "0.18.1" rand = "0.8.5" -regex = "1.11.1" +regex-lite = "0.1.6" reqwest = { version = "0.12.12", default-features = false } reqwest-middleware = "0.4.0" reqwest-retry = "0.7.0" diff --git a/postgresql_archive/Cargo.toml b/postgresql_archive/Cargo.toml index ef903d9..e2e988b 100644 --- a/postgresql_archive/Cargo.toml +++ b/postgresql_archive/Cargo.toml @@ -19,7 +19,7 @@ liblzma = { workspace = true } md-5 = { workspace = true, optional = true } num-format = { workspace = true } quick-xml = { workspace = true, features = ["serialize"], optional = true } -regex = { workspace = true } +regex-lite = { workspace = true } reqwest = { workspace = true, default-features = false, features = ["json", "stream"] } reqwest-middleware = { workspace = true } reqwest-retry = { workspace = true } diff --git a/postgresql_archive/src/archive.rs b/postgresql_archive/src/archive.rs index ac3f631..47c85c6 100644 --- a/postgresql_archive/src/archive.rs +++ b/postgresql_archive/src/archive.rs @@ -3,7 +3,7 @@ use crate::error::Result; use crate::{extractor, repository}; -use regex::Regex; +use regex_lite::Regex; use semver::{Version, VersionReq}; use std::path::{Path, PathBuf}; use tracing::instrument; diff --git a/postgresql_archive/src/configuration/theseus/extractor.rs b/postgresql_archive/src/configuration/theseus/extractor.rs index 2089778..8594cdb 100644 --- a/postgresql_archive/src/configuration/theseus/extractor.rs +++ b/postgresql_archive/src/configuration/theseus/extractor.rs @@ -1,7 +1,7 @@ use crate::extractor::{tar_gz_extract, ExtractDirectories}; use crate::Error::Unexpected; use crate::Result; -use regex::Regex; +use regex_lite::Regex; use std::fs::{create_dir_all, remove_dir_all, remove_file, rename}; use std::path::{Path, PathBuf}; use std::thread::sleep; diff --git a/postgresql_archive/src/configuration/zonky/extractor.rs b/postgresql_archive/src/configuration/zonky/extractor.rs index c08cb27..5601ab9 100644 --- a/postgresql_archive/src/configuration/zonky/extractor.rs +++ b/postgresql_archive/src/configuration/zonky/extractor.rs @@ -1,7 +1,7 @@ use crate::extractor::{tar_xz_extract, ExtractDirectories}; use crate::Error::Unexpected; use crate::Result; -use regex::Regex; +use regex_lite::Regex; use std::fs::{create_dir_all, remove_dir_all, remove_file, rename}; use std::io::Cursor; use std::path::{Path, PathBuf}; diff --git a/postgresql_archive/src/error.rs b/postgresql_archive/src/error.rs index ea9eb0e..7a06398 100644 --- a/postgresql_archive/src/error.rs +++ b/postgresql_archive/src/error.rs @@ -48,9 +48,9 @@ pub enum Error { VersionNotFound(String), } -/// Converts a [`regex::Error`] into an [`ParseError`](Error::ParseError) -impl From for Error { - fn from(error: regex::Error) -> Self { +/// Converts a [`regex_lite::Error`] into an [`ParseError`](Error::ParseError) +impl From for Error { + fn from(error: regex_lite::Error) -> Self { Error::ParseError(error.to_string()) } } @@ -125,9 +125,9 @@ mod test { #[test] fn test_from_regex_error() { - let regex_error = regex::Error::Syntax("test".to_string()); + let regex_error = regex_lite::Regex::new("(?=a)").expect_err("regex error"); let error = Error::from(regex_error); - assert_eq!(error.to_string(), "test"); + assert_eq!(error.to_string(), "look-around is not supported"); } #[tokio::test] diff --git a/postgresql_archive/src/extractor/model.rs b/postgresql_archive/src/extractor/model.rs index 258c266..df9f9a3 100644 --- a/postgresql_archive/src/extractor/model.rs +++ b/postgresql_archive/src/extractor/model.rs @@ -1,5 +1,5 @@ use crate::{Error, Result}; -use regex::Regex; +use regex_lite::Regex; use std::fmt::Display; use std::path::PathBuf; diff --git a/postgresql_archive/src/extractor/registry.rs b/postgresql_archive/src/extractor/registry.rs index 46b2e16..40e322a 100644 --- a/postgresql_archive/src/extractor/registry.rs +++ b/postgresql_archive/src/extractor/registry.rs @@ -98,7 +98,7 @@ pub fn get(url: &str) -> Result { #[cfg(test)] mod tests { use super::*; - use regex::Regex; + use regex_lite::Regex; #[test] fn test_register() -> Result<()> { diff --git a/postgresql_archive/src/repository/github/repository.rs b/postgresql_archive/src/repository/github/repository.rs index 7c43389..9d95844 100644 --- a/postgresql_archive/src/repository/github/repository.rs +++ b/postgresql_archive/src/repository/github/repository.rs @@ -8,7 +8,7 @@ use crate::Error::{ use crate::{hasher, matcher, Result}; use async_trait::async_trait; use futures_util::StreamExt; -use regex::Regex; +use regex_lite::Regex; use reqwest::header::HeaderMap; use reqwest_middleware::{ClientBuilder, ClientWithMiddleware}; use reqwest_retry::policies::ExponentialBackoff; diff --git a/postgresql_extensions/Cargo.toml b/postgresql_extensions/Cargo.toml index f06c5f2..e997f4d 100644 --- a/postgresql_extensions/Cargo.toml +++ b/postgresql_extensions/Cargo.toml @@ -14,7 +14,7 @@ version.workspace = true async-trait = { workspace = true } postgresql_archive = { path = "../postgresql_archive", version = "0.17.4", default-features = false } postgresql_commands = { path = "../postgresql_commands", version = "0.17.4", default-features = false } -regex = { workspace = true } +regex-lite = { workspace = true } reqwest = { workspace = true, default-features = false, features = ["json"] } semver = { workspace = true, features = ["serde"] } serde = { workspace = true, features = ["derive"] } diff --git a/postgresql_extensions/src/error.rs b/postgresql_extensions/src/error.rs index 0174adb..fbf4ec9 100644 --- a/postgresql_extensions/src/error.rs +++ b/postgresql_extensions/src/error.rs @@ -14,14 +14,14 @@ pub enum Error { #[error("extension not found '{0}'")] ExtensionNotFound(String), /// Error when an IO operation fails - #[error(transparent)] - IoError(#[from] std::io::Error), + #[error("{0}")] + IoError(String), /// Poisoned lock #[error("poisoned lock '{0}'")] PoisonedLock(String), /// Error when a regex operation fails #[error(transparent)] - RegexError(#[from] regex::Error), + RegexError(#[from] regex_lite::Error), /// Error when a deserialization or serialization operation fails #[error(transparent)] SerdeError(#[from] serde_json::Error), diff --git a/postgresql_extensions/src/extensions.rs b/postgresql_extensions/src/extensions.rs index e911c78..c820346 100644 --- a/postgresql_extensions/src/extensions.rs +++ b/postgresql_extensions/src/extensions.rs @@ -1,6 +1,7 @@ use crate::model::AvailableExtension; use crate::repository::registry; use crate::repository::registry::get_repositories; +use crate::Error::IoError; use crate::{InstalledConfiguration, InstalledExtension, Result}; use postgresql_commands::pg_config::PgConfigBuilder; use postgresql_commands::postgres::PostgresBuilder; @@ -10,7 +11,7 @@ use postgresql_commands::CommandBuilder; #[cfg(not(feature = "tokio"))] use postgresql_commands::CommandExecutor; use postgresql_commands::Settings; -use regex::Regex; +use regex_lite::Regex; use semver::VersionReq; use std::path::PathBuf; use tracing::{debug, instrument}; @@ -116,9 +117,12 @@ pub async fn uninstall(settings: &impl Settings, namespace: &str, name: &str) -> if file.exists() { debug!("Removing file: {file:?}"); #[cfg(feature = "tokio")] - tokio::fs::remove_file(file).await?; + tokio::fs::remove_file(file) + .await + .map_err(|error| IoError(error.to_string()))?; #[cfg(not(feature = "tokio"))] - std::fs::remove_file(file)?; + std::fs::remove_file(file) + .map_err(|error| crate::error::Error::IoError(error.to_string()))?; } } } @@ -208,16 +212,14 @@ async fn get_postgresql_version(settings: &dyn Settings) -> Result { let (stdout, _stderr) = execute_command(command).await?; let re = Regex::new(r"PostgreSQL\)\s(\d+\.\d+)")?; let Some(captures) = re.captures(&stdout) else { - return Err(regex::Error::Syntax(format!( + return Err(IoError(format!( "Failed to obtain postgresql version from {stdout}" - )) - .into()); + ))); }; let Some(version) = captures.get(1) else { - return Err(regex::Error::Syntax(format!( + return Err(IoError(format!( "Failed to match postgresql version from {stdout}" - )) - .into()); + ))); }; let version = version.as_str(); debug!("Obtained PostgreSQL version from postgres command: {version}"); diff --git a/postgresql_extensions/src/matcher.rs b/postgresql_extensions/src/matcher.rs index 161f11c..29ebc43 100644 --- a/postgresql_extensions/src/matcher.rs +++ b/postgresql_extensions/src/matcher.rs @@ -1,5 +1,5 @@ use postgresql_archive::Result; -use regex::Regex; +use regex_lite::Regex; use semver::Version; use std::collections::HashMap; use std::env::consts; diff --git a/postgresql_extensions/src/model.rs b/postgresql_extensions/src/model.rs index bb07f33..b368cfc 100644 --- a/postgresql_extensions/src/model.rs +++ b/postgresql_extensions/src/model.rs @@ -1,3 +1,4 @@ +use crate::Error::IoError; use crate::Result; use semver::Version; use serde::{Deserialize, Serialize}; @@ -74,17 +75,23 @@ impl InstalledConfiguration { pub async fn read>(path: P) -> Result { #[cfg(feature = "tokio")] { - let mut file = tokio::fs::File::open(path.into()).await?; + let mut file = tokio::fs::File::open(path.into()) + .await + .map_err(|error| IoError(error.to_string()))?; let mut contents = vec![]; - file.read_to_end(&mut contents).await?; + file.read_to_end(&mut contents) + .await + .map_err(|error| IoError(error.to_string()))?; let config = serde_json::from_slice(&contents)?; Ok(config) } #[cfg(not(feature = "tokio"))] { - let file = std::fs::File::open(path.into())?; + let file = + std::fs::File::open(path.into()).map_err(|error| IoError(error.to_string()))?; let reader = std::io::BufReader::new(file); - let config = serde_json::from_reader(reader)?; + let config = + serde_json::from_reader(reader).map_err(|error| IoError(error.to_string()))?; Ok(config) } } @@ -98,13 +105,19 @@ impl InstalledConfiguration { #[cfg(feature = "tokio")] { - let mut file = tokio::fs::File::create(path.into()).await?; - file.write_all(content.as_bytes()).await?; + let mut file = tokio::fs::File::create(path.into()) + .await + .map_err(|error| IoError(error.to_string()))?; + file.write_all(content.as_bytes()) + .await + .map_err(|error| IoError(error.to_string()))?; } #[cfg(not(feature = "tokio"))] { - let mut file = std::fs::File::create(path.into())?; - file.write_all(content.as_bytes())?; + let mut file = + std::fs::File::create(path.into()).map_err(|error| IoError(error.to_string()))?; + file.write_all(content.as_bytes()) + .map_err(|error| IoError(error.to_string()))?; } Ok(()) } @@ -236,7 +249,8 @@ mod tests { #[cfg(target_os = "linux")] #[tokio::test] async fn test_installed_configuration_io() -> Result<()> { - let temp_file = tempfile::NamedTempFile::new()?; + let temp_file = + tempfile::NamedTempFile::new().map_err(|error| IoError(error.to_string()))?; let file = temp_file.as_ref(); let extensions = vec![InstalledExtension::new( "namespace", @@ -248,7 +262,9 @@ mod tests { expected_configuration.write(file).await?; let configuration = InstalledConfiguration::read(file).await?; assert_eq!(expected_configuration, configuration); - tokio::fs::remove_file(file).await?; + tokio::fs::remove_file(file) + .await + .map_err(|error| IoError(error.to_string()))?; Ok(()) } diff --git a/postgresql_extensions/src/repository/portal_corp/repository.rs b/postgresql_extensions/src/repository/portal_corp/repository.rs index 4a07cfc..0c63997 100644 --- a/postgresql_extensions/src/repository/portal_corp/repository.rs +++ b/postgresql_extensions/src/repository/portal_corp/repository.rs @@ -7,7 +7,7 @@ use async_trait::async_trait; use postgresql_archive::extractor::{zip_extract, ExtractDirectories}; use postgresql_archive::get_archive; use postgresql_archive::repository::github::repository::GitHub; -use regex::Regex; +use regex_lite::Regex; use semver::{Version, VersionReq}; use std::fmt::Debug; use std::path::PathBuf; diff --git a/postgresql_extensions/src/repository/steampipe/repository.rs b/postgresql_extensions/src/repository/steampipe/repository.rs index 6723d4e..e39aac5 100644 --- a/postgresql_extensions/src/repository/steampipe/repository.rs +++ b/postgresql_extensions/src/repository/steampipe/repository.rs @@ -8,7 +8,7 @@ use async_trait::async_trait; use postgresql_archive::extractor::{tar_gz_extract, ExtractDirectories}; use postgresql_archive::get_archive; use postgresql_archive::repository::github::repository::GitHub; -use regex::Regex; +use regex_lite::Regex; use semver::{Version, VersionReq}; use std::fmt::Debug; use std::path::PathBuf; diff --git a/postgresql_extensions/src/repository/tensor_chord/repository.rs b/postgresql_extensions/src/repository/tensor_chord/repository.rs index 729929c..67ce586 100644 --- a/postgresql_extensions/src/repository/tensor_chord/repository.rs +++ b/postgresql_extensions/src/repository/tensor_chord/repository.rs @@ -7,7 +7,7 @@ use async_trait::async_trait; use postgresql_archive::extractor::{zip_extract, ExtractDirectories}; use postgresql_archive::get_archive; use postgresql_archive::repository::github::repository::GitHub; -use regex::Regex; +use regex_lite::Regex; use semver::{Version, VersionReq}; use std::fmt::Debug; use std::path::PathBuf;