From 7c49a5cacb63dbf246a0e853db489c166fa0ea38 Mon Sep 17 00:00:00 2001 From: DecDuck Date: Mon, 1 Dec 2025 11:14:18 +1100 Subject: [PATCH] feat: add backend constructor --- libraries/droplet/Cargo.lock | 2 +- libraries/droplet/Cargo.toml | 2 +- libraries/droplet/src/versions/mod.rs | 54 ++++++++++++++++++++++++++- 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/libraries/droplet/Cargo.lock b/libraries/droplet/Cargo.lock index 22be2c74..a88d8f7e 100644 --- a/libraries/droplet/Cargo.lock +++ b/libraries/droplet/Cargo.lock @@ -158,7 +158,7 @@ dependencies = [ [[package]] name = "droplet-rs" -version = "0.8.0" +version = "0.8.1" dependencies = [ "anyhow", "dyn-clone", diff --git a/libraries/droplet/Cargo.toml b/libraries/droplet/Cargo.toml index b0d0c7da..0ec263d7 100644 --- a/libraries/droplet/Cargo.toml +++ b/libraries/droplet/Cargo.toml @@ -2,7 +2,7 @@ edition = "2021" authors = ["Drop-OSS"] name = "droplet-rs" -version = "0.8.0" +version = "0.8.1" license = "AGPL-3.0-only" description = "Droplet is a `napi.rs` Rust/Node.js package full of high-performance and low-level utils for Drop" diff --git a/libraries/droplet/src/versions/mod.rs b/libraries/droplet/src/versions/mod.rs index 21b07e7c..fd11106b 100644 --- a/libraries/droplet/src/versions/mod.rs +++ b/libraries/droplet/src/versions/mod.rs @@ -1,2 +1,54 @@ +use std::path::Path; + +use anyhow::Result; + +use crate::versions::{ + backends::{ + PathVersionBackend, ZipVersionBackend, SEVEN_ZIP_INSTALLED, SUPPORTED_FILE_EXTENSIONS, + }, + types::VersionBackend, +}; + +pub mod backends; pub mod types; -pub mod backends; \ No newline at end of file +pub fn create_backend_constructor<'a>( + path: &Path, +) -> Option Result>>> { + if !path.exists() { + return None; + } + + let is_directory = path.is_dir(); + if is_directory { + let base_dir = path.to_path_buf(); + return Some(Box::new(move || { + Ok(Box::new(PathVersionBackend { base_dir })) + })); + }; + + if *SEVEN_ZIP_INSTALLED { + /* + Slow 7zip integrity test + let mut test = Command::new("7z"); + test.args(vec!["t", path.to_str().expect("invalid utf path")]); + let status = test.status().ok()?; + if status.code().unwrap_or(1) == 0 { + let buf = path.to_path_buf(); + return Some(Box::new(move || Ok(Box::new(ZipVersionBackend::new(buf)?)))); + } + */ + // Fast filename-based test + if let Some(extension) = path.extension().and_then(|v| v.to_str()) { + let supported = SUPPORTED_FILE_EXTENSIONS + .iter() + .find(|v| ***v == *extension) + .is_some(); + if supported { + let buf = path.to_path_buf(); + return Some(Box::new(move || Ok(Box::new(ZipVersionBackend::new(buf)?)))); + } + } + } + + None +}