Files
mdrs-client-rust/src/commands/mkdir.rs
T
2026-04-17 16:52:04 +09:00

52 lines
1.8 KiB
Rust

use crate::commands::shared::{
create_authenticated_conn, find_file_by_name, find_folder, find_lab_in_cache, load_cache_with_token_refresh,
parse_remote_path,
};
pub async fn mkdir(remote_path: &str) -> Result<(), Box<dyn std::error::Error>> {
let (remote, labname, path) = parse_remote_path(remote_path)?;
// Split into parent path and new folder name
let path = path.trim_end_matches('/');
let last_slash = path
.rfind('/')
.ok_or("Invalid path: cannot determine parent folder")?;
let parent_path = if last_slash == 0 {
"/"
} else {
&path[..last_slash]
};
let new_folder_name = &path[last_slash + 1..];
if new_folder_name.is_empty() {
return Err("Invalid path: folder name cannot be empty".into());
}
let cache = load_cache_with_token_refresh(&remote).await?;
let conn = create_authenticated_conn(&remote, &cache)?;
let lab = find_lab_in_cache(&cache, &labname)?;
let parent_folder = find_folder(&conn, lab.id, parent_path, None).await?;
// Check for name conflict in sub-folders
if parent_folder
.sub_folders
.iter()
.any(|f| f.name == new_folder_name)
{
return Err(format!("'{}' already exists as a folder", new_folder_name).into());
}
// Check for name conflict in files
let files = conn.list_all_files(&parent_folder.id).await?;
if find_file_by_name(&files, new_folder_name).is_some() {
return Err(format!("'{}' already exists as a file", new_folder_name).into());
}
let resp = conn
.create_folder(&parent_folder.id, new_folder_name)
.await?;
if !resp.status().is_success() {
return Err(format!("Failed to create folder: {}", resp.status()).into());
}
println!("Created folder: {}", new_folder_name);
Ok(())
}