52 lines
1.8 KiB
Rust
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(())
|
|
}
|