From addd1802ff98124c8dec771ffa287a1f4de77138 Mon Sep 17 00:00:00 2001 From: Kirill Date: Mon, 2 Mar 2026 17:39:13 +0300 Subject: [PATCH] feat(files): add functions: list - get storage data size - get storage data and file count about - get storage info --- src/operations/files.rs | 64 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 src/operations/files.rs diff --git a/src/operations/files.rs b/src/operations/files.rs new file mode 100644 index 0000000..dc580f1 --- /dev/null +++ b/src/operations/files.rs @@ -0,0 +1,64 @@ +use super::*; +use crate::rclone_install::RcloneApp; +use serde_json::Value; + +/// Получить содержимое директории +pub fn list(app: &RcloneApp, remote_path: &str) -> Result, String> { + let output = app.run_command(&["lsjson", remote_path])?; + + let files: Vec = serde_json::from_str(&output) + .map_err(|e| format!("Ошибка парсинга списка файлов: {}", e))?; + + let mut file_infos = Vec::new(); + for item in files { + let name = item["Name"].as_str().unwrap_or("").to_string(); + let path = item["Path"].as_str().unwrap_or("").to_string(); + let size = item["Size"].as_u64().unwrap_or(0); + let is_dir = item["IsDir"].as_bool().unwrap_or(false); + let modified = item["ModTime"].as_str().map(String::from); + + file_infos.push(FileInfo { + name, + path, + size, + is_dir, + modified, + }); + } + + Ok(file_infos) +} + +/// Получить размер и количество файлов +pub fn size(app: &RcloneApp, path: &str) -> Result<(u64, u64), String> { + let output = app.run_command(&["size", path, "--json"])?; + + let size_info: Value = + serde_json::from_str(&output).map_err(|e| format!("Ошибка парсинга размера: {}", e))?; + + let count = size_info["count"].as_u64().unwrap_or(0); + let bytes = size_info["bytes"].as_u64().unwrap_or(0); + + Ok((bytes, count)) +} + +/// Получить информацию о хранилище (общий объем, использовано, свободно) +pub fn about(app: &RcloneApp, remote: &str) -> Result, String> { + let output = app.run_command(&["about", remote, "--json"])?; + + let about_info: Value = serde_json::from_str(&output) + .map_err(|e| format!("Ошибка парсинга информации о хранилище: {}", e))?; + + let mut info = HashMap::new(); + if let Some(obj) = about_info.as_object() { + for (key, value) in obj { + if let Some(num) = value.as_u64() { + info.insert(key.clone(), num); + } else if let Some(num) = value.as_f64() { + info.insert(key.clone(), num as u64); + } + } + } + + Ok(info) +}