From 24c9d2e5a9571f586ce42c7b355a501b5b5c9ce3 Mon Sep 17 00:00:00 2001 From: Kirill Date: Mon, 2 Mar 2026 17:45:06 +0300 Subject: [PATCH] feat(search): Add functions: by_name - search file by name --- src/operations/search.rs | 45 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 src/operations/search.rs diff --git a/src/operations/search.rs b/src/operations/search.rs new file mode 100644 index 0000000..af8ed73 --- /dev/null +++ b/src/operations/search.rs @@ -0,0 +1,45 @@ +use super::*; +use crate::rclone_install::RcloneApp; +use serde_json::Value; + +/// Найти файлы по имени +pub fn by_name( + app: &RcloneApp, + path: &str, + pattern: &str, + options: &FindOptions, +) -> Result, String> { + let mut args = vec!["lsjson", path]; + + if options.recursive { + args.push("-R"); + } + + let output = app.run_command(&args)?; + let files: Vec = + serde_json::from_str(&output).map_err(|e| format!("Ошибка парсинга: {}", e))?; + + let pattern = pattern.to_lowercase(); + let mut results = Vec::new(); + + for item in files { + let name = item["Name"].as_str().unwrap_or(""); + let path = item["Path"].as_str().unwrap_or(""); + + if name.to_lowercase().contains(&pattern) || path.to_lowercase().contains(&pattern) { + results.push(FileInfo { + name: name.to_string(), + path: path.to_string(), + size: item["Size"].as_u64().unwrap_or(0), + is_dir: item["IsDir"].as_bool().unwrap_or(false), + modified: item["ModTime"].as_str().map(String::from), + }); + } + + if results.len() >= options.max_results { + break; + } + } + + Ok(results) +}