feat(config): allow specifying a custom file filter

This commit is contained in:
Harsh Shandilya 2023-08-14 18:56:31 +05:30
parent c5b7c9e493
commit c018b6000d
No known key found for this signature in database
5 changed files with 80 additions and 1 deletions

1
.gitignore vendored
View File

@ -1 +1,2 @@
/target
/config.toml

62
Cargo.lock generated
View File

@ -17,6 +17,15 @@ version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
[[package]]
name = "aho-corasick"
version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "86b8f9420f797f2d9e935edf629310eb938a0d839f984e25327f3c7eed22300c"
dependencies = [
"memchr",
]
[[package]]
name = "anyhow"
version = "1.0.72"
@ -88,6 +97,16 @@ version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635"
[[package]]
name = "bstr"
version = "1.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05"
dependencies = [
"memchr",
"serde",
]
[[package]]
name = "byteorder"
version = "1.4.3"
@ -191,6 +210,7 @@ dependencies = [
"basic-toml",
"dirs",
"futures 0.3.28",
"globset",
"serde",
"serde_derive",
"tokio",
@ -319,6 +339,19 @@ version = "0.27.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
[[package]]
name = "globset"
version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d"
dependencies = [
"aho-corasick",
"bstr",
"fnv",
"log",
"regex",
]
[[package]]
name = "hermit-abi"
version = "0.3.2"
@ -545,6 +578,35 @@ dependencies = [
"thiserror",
]
[[package]]
name = "regex"
version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.3.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.7.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2"
[[package]]
name = "rustc-demangle"
version = "0.1.23"

View File

@ -17,6 +17,7 @@ anyhow = "1.0.72"
basic-toml = "0.1.4"
dirs = "5.0.1"
futures = "0.3.28"
globset = "0.4.13"
serde = "1.0.183"
serde_derive = "1.0.183"
tokio = { version = "1.31.0", features = ["tokio-macros"] }

View File

@ -1,4 +1,5 @@
use anyhow::{anyhow, Result};
use globset::Glob;
use serde_derive::Deserialize;
use std::path::PathBuf;
use tracing::trace;
@ -14,6 +15,18 @@ pub struct Bucket<'bucket> {
pub name: Option<&'bucket str>,
pub sources: Vec<PathBuf>,
pub target: PathBuf,
pub file_filter: Option<&'bucket str>,
}
impl<'a> Root<'a> {
pub fn is_match(&self, file_name: &str) -> bool {
if let Some(pattern) = self.bucket.file_filter {
if let Ok(glob) = Glob::new(pattern) {
return glob.compile_matcher().is_match(file_name);
}
};
true
}
}
pub fn get_path() -> Result<PathBuf> {
@ -48,6 +61,7 @@ mod test {
"/mnt/data/Game 1/screenshots"
]
target = "/home/test/screenshots"
file_filter = "*.mp4"
"#;
let config: Root<'_> = from_str(config)?;
let bucket = &config.bucket;
@ -57,5 +71,6 @@ mod test {
bucket.sources
);
assert_eq!(PathBuf::from("/home/test/screenshots"), bucket.target);
assert_eq!(Some("*.mp4"), config.bucket.file_filter);
}
}

View File

@ -35,7 +35,7 @@ async fn run() -> Result<()> {
let name = file.name.as_path();
let exists = *file.exists;
let empty = *file.size == 0;
if exists && !empty {
if exists && !empty && config.is_match(name.to_str().unwrap()) {
let source = config.bucket.sources[index].join(name);
let source = source.as_path();
let target = config.bucket.target.join(source.file_name().unwrap());