Simple tool for automatic file management

ft: add Tokio to make processing async

As we are operating mostly on FS it should substantially impact
performance as we can run most of the operations concurrently.

hauleth.dev 46e49d23 2abf4e16

verified
Changed files
+452 -13
src
+425
Cargo.lock
···
version = 3
[[package]]
+
name = "addr2line"
+
version = "0.21.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb"
+
dependencies = [
+
"gimli",
+
]
+
+
[[package]]
+
name = "adler"
+
version = "1.0.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"
+
+
[[package]]
name = "aho-corasick"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
]
[[package]]
+
name = "autocfg"
+
version = "1.1.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+
[[package]]
+
name = "backtrace"
+
version = "0.3.69"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
+
dependencies = [
+
"addr2line",
+
"cc",
+
"cfg-if",
+
"libc",
+
"miniz_oxide",
+
"object",
+
"rustc-demangle",
+
]
+
+
[[package]]
+
name = "bitflags"
+
version = "1.3.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+
[[package]]
+
name = "bytes"
+
version = "1.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223"
+
+
[[package]]
+
name = "cc"
+
version = "1.0.83"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0"
+
dependencies = [
+
"libc",
+
]
+
+
[[package]]
+
name = "cfg-if"
+
version = "1.0.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+
[[package]]
+
name = "color-eyre"
+
version = "0.6.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "5a667583cca8c4f8436db8de46ea8233c42a7d9ae424a82d338f2e4675229204"
+
dependencies = [
+
"backtrace",
+
"color-spantrace",
+
"eyre",
+
"indenter",
+
"once_cell",
+
"owo-colors",
+
"tracing-error",
+
]
+
+
[[package]]
+
name = "color-spantrace"
+
version = "0.2.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "cd6be1b2a7e382e2b98b43b2adcca6bb0e465af0bdd38123873ae61eb17a72c2"
+
dependencies = [
+
"once_cell",
+
"owo-colors",
+
"tracing-core",
+
"tracing-error",
+
]
+
+
[[package]]
+
name = "eyre"
+
version = "0.6.11"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "b6267a1fa6f59179ea4afc8e50fd8612a3cc60bc858f786ff877a4a8cb042799"
+
dependencies = [
+
"indenter",
+
"once_cell",
+
]
+
+
[[package]]
+
name = "gimli"
+
version = "0.28.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
+
+
[[package]]
+
name = "hermit-abi"
+
version = "0.3.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7"
+
+
[[package]]
+
name = "indenter"
+
version = "0.3.3"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683"
+
+
[[package]]
name = "itoa"
version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
[[package]]
+
name = "lazy_static"
+
version = "1.4.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+
[[package]]
+
name = "libc"
+
version = "0.2.152"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7"
+
+
[[package]]
+
name = "lock_api"
+
version = "0.4.11"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
+
dependencies = [
+
"autocfg",
+
"scopeguard",
+
]
+
+
[[package]]
name = "memchr"
version = "2.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
[[package]]
+
name = "miniz_oxide"
+
version = "0.7.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7"
+
dependencies = [
+
"adler",
+
]
+
+
[[package]]
+
name = "mio"
+
version = "0.8.10"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09"
+
dependencies = [
+
"libc",
+
"wasi",
+
"windows-sys",
+
]
+
+
[[package]]
+
name = "num_cpus"
+
version = "1.16.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43"
+
dependencies = [
+
"hermit-abi",
+
"libc",
+
]
+
+
[[package]]
+
name = "object"
+
version = "0.32.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441"
+
dependencies = [
+
"memchr",
+
]
+
+
[[package]]
+
name = "once_cell"
+
version = "1.19.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
+
+
[[package]]
+
name = "owo-colors"
+
version = "3.5.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f"
+
+
[[package]]
+
name = "parking_lot"
+
version = "0.12.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+
dependencies = [
+
"lock_api",
+
"parking_lot_core",
+
]
+
+
[[package]]
+
name = "parking_lot_core"
+
version = "0.9.9"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
+
dependencies = [
+
"cfg-if",
+
"libc",
+
"redox_syscall",
+
"smallvec",
+
"windows-targets",
+
]
+
+
[[package]]
+
name = "pin-project-lite"
+
version = "0.2.13"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+
+
[[package]]
name = "proc-macro2"
version = "1.0.76"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
name = "ptsd"
version = "0.1.0"
dependencies = [
+
"color-eyre",
"regex",
"serde",
"serde_json",
+
"tokio",
"wildmatch",
]
···
]
[[package]]
+
name = "redox_syscall"
+
version = "0.4.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
+
dependencies = [
+
"bitflags",
+
]
+
+
[[package]]
name = "regex"
version = "1.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
[[package]]
+
name = "rustc-demangle"
+
version = "0.1.23"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+
+
[[package]]
name = "ryu"
version = "1.0.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
[[package]]
+
name = "scopeguard"
+
version = "1.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
+
+
[[package]]
name = "serde"
version = "1.0.195"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
]
[[package]]
+
name = "sharded-slab"
+
version = "0.1.7"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6"
+
dependencies = [
+
"lazy_static",
+
]
+
+
[[package]]
+
name = "signal-hook-registry"
+
version = "1.4.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
+
dependencies = [
+
"libc",
+
]
+
+
[[package]]
+
name = "smallvec"
+
version = "1.11.2"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "4dccd0940a2dcdf68d092b8cbab7dc0ad8fa938bf95787e1b916b0e3d0e8e970"
+
+
[[package]]
name = "syn"
version = "2.0.48"
source = "registry+https://github.com/rust-lang/crates.io-index"
···
]
[[package]]
+
name = "thread_local"
+
version = "1.1.7"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152"
+
dependencies = [
+
"cfg-if",
+
"once_cell",
+
]
+
+
[[package]]
+
name = "tokio"
+
version = "1.35.1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "c89b4efa943be685f629b149f53829423f8f5531ea21249408e8e2f8671ec104"
+
dependencies = [
+
"backtrace",
+
"bytes",
+
"libc",
+
"mio",
+
"num_cpus",
+
"parking_lot",
+
"pin-project-lite",
+
"signal-hook-registry",
+
"tokio-macros",
+
"windows-sys",
+
]
+
+
[[package]]
+
name = "tokio-macros"
+
version = "2.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
+
dependencies = [
+
"proc-macro2",
+
"quote",
+
"syn",
+
]
+
+
[[package]]
+
name = "tracing"
+
version = "0.1.40"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef"
+
dependencies = [
+
"pin-project-lite",
+
"tracing-core",
+
]
+
+
[[package]]
+
name = "tracing-core"
+
version = "0.1.32"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54"
+
dependencies = [
+
"once_cell",
+
"valuable",
+
]
+
+
[[package]]
+
name = "tracing-error"
+
version = "0.2.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "d686ec1c0f384b1277f097b2f279a2ecc11afe8c133c1aabf036a27cb4cd206e"
+
dependencies = [
+
"tracing",
+
"tracing-subscriber",
+
]
+
+
[[package]]
+
name = "tracing-subscriber"
+
version = "0.3.18"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b"
+
dependencies = [
+
"sharded-slab",
+
"thread_local",
+
"tracing-core",
+
]
+
+
[[package]]
name = "unicode-ident"
version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b"
+
+
[[package]]
+
name = "valuable"
+
version = "0.1.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
+
+
[[package]]
+
name = "wasi"
+
version = "0.11.0+wasi-snapshot-preview1"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
[[package]]
name = "wildmatch"
version = "2.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "495ec47bf3c1345005f40724f0269362c8556cbc43aed0526ed44cae1d35fceb"
+
+
[[package]]
+
name = "windows-sys"
+
version = "0.48.0"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
+
dependencies = [
+
"windows-targets",
+
]
+
+
[[package]]
+
name = "windows-targets"
+
version = "0.48.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
+
dependencies = [
+
"windows_aarch64_gnullvm",
+
"windows_aarch64_msvc",
+
"windows_i686_gnu",
+
"windows_i686_msvc",
+
"windows_x86_64_gnu",
+
"windows_x86_64_gnullvm",
+
"windows_x86_64_msvc",
+
]
+
+
[[package]]
+
name = "windows_aarch64_gnullvm"
+
version = "0.48.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
+
+
[[package]]
+
name = "windows_aarch64_msvc"
+
version = "0.48.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
+
+
[[package]]
+
name = "windows_i686_gnu"
+
version = "0.48.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
+
+
[[package]]
+
name = "windows_i686_msvc"
+
version = "0.48.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
+
+
[[package]]
+
name = "windows_x86_64_gnu"
+
version = "0.48.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
+
+
[[package]]
+
name = "windows_x86_64_gnullvm"
+
version = "0.48.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
+
+
[[package]]
+
name = "windows_x86_64_msvc"
+
version = "0.48.5"
+
source = "registry+https://github.com/rust-lang/crates.io-index"
+
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
+2
Cargo.toml
···
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
+
color-eyre = "0.6.2"
regex = "1.10.2"
serde = { version = "1.0.195", features = ["derive"] }
serde_json = "1.0.111"
+
tokio = { version = "1.35.1", default-features = false, features = ["rt-multi-thread", "fs", "io-std", "io-util", "macros", "process", "parking_lot", "mio"] }
wildmatch = "2.3.0"
+15 -9
src/job.rs
···
+
use color_eyre::eyre::Result;
+
use std::fmt;
use std::path::{Path, PathBuf};
-
use std::process::Command;
+
+
use tokio::fs;
+
use tokio::process::Command;
use serde::{de, Deserialize};
use wildmatch::WildMatch;
···
}
impl Job {
-
pub fn run(&self) {
+
pub async fn run(&self) -> Result<()> {
let loc = normalise_path(&self.location);
-
for entry in loc.read_dir().unwrap() {
-
let entry = entry.unwrap();
+
let mut dir = fs::read_dir(&loc).await?;
+
while let Some(entry) = dir.next_entry().await? {
if self.pattern.matches(entry.file_name().as_ref()) {
-
self.execute_actions(&loc, entry.path().as_ref());
+
self.execute_actions(&loc, entry.path().as_ref()).await;
}
}
+
+
Ok(())
}
-
fn execute_actions(&self, loc: &Path, path: &Path) {
+
async fn execute_actions(&self, loc: &Path, path: &Path) {
for action in &self.actions {
-
action.execute(loc, path);
+
action.execute(loc, path).await;
}
}
}
···
Wildcard(WildMatch),
#[serde(deserialize_with = "deserialize_regex")]
Regex(regex::Regex),
-
#[serde(untagged)]
Exact(Box<Path>),
}
···
}
impl Action {
-
pub fn execute(&self, dir: &Path, source: &Path) {
+
pub async fn execute(&self, dir: &Path, source: &Path) {
match *self {
Action::Script { ref script } => {
Command::new(script.as_ref())
···
.spawn()
.expect("Couldnt spawn process")
.wait()
+
.await
.expect("Child exited abnormally");
}
+10 -4
src/main.rs
···
#![feature(io_error_more)]
+
+
use color_eyre::eyre::Result;
+
mod job;
const data: &str = r#"
{
-
"pattern": {"Wildcard": "*.gp5"},
+
"pattern": {"Wildcard": "*.dmg"},
"location": "~/Downloads",
"actions": [
-
{"move_to": "~/Documents/Gitara/"}
+
{"message": "move to ~/Documents/Gitara/"}
]
}"#;
-
fn main() {
+
#[tokio::main]
+
async fn main() -> Result<()> {
println!("{data}");
let j: job::Job = serde_json::from_str(data).unwrap();
-
j.run();
+
j.run().await?;
println!("{j:?}");
+
+
Ok(())
}