mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
67 lines
1.8 KiB
Rust
67 lines
1.8 KiB
Rust
use std::collections::HashMap;
|
|
|
|
use anyhow::Result;
|
|
use tokio::fs;
|
|
use yazi_config::popup::{ConfirmCfg, InputCfg};
|
|
use yazi_proxy::{ConfirmProxy, InputProxy, TabProxy, WATCHER};
|
|
use yazi_shared::{event::Cmd, fs::{maybe_exists, ok_or_not_found, symlink_realpath, File, FilesOp, Url}};
|
|
|
|
use crate::manager::Manager;
|
|
|
|
pub struct Opt {
|
|
dir: bool,
|
|
force: bool,
|
|
}
|
|
|
|
impl From<Cmd> for Opt {
|
|
fn from(c: Cmd) -> Self { Self { dir: c.bool("dir"), force: c.bool("force") } }
|
|
}
|
|
|
|
impl Manager {
|
|
pub fn create(&self, opt: impl Into<Opt>) {
|
|
let opt = opt.into() as Opt;
|
|
let cwd = self.cwd().to_owned();
|
|
tokio::spawn(async move {
|
|
let mut result = InputProxy::show(InputCfg::create(opt.dir));
|
|
let Some(Ok(name)) = result.recv().await else {
|
|
return Ok(());
|
|
};
|
|
if name.is_empty() {
|
|
return Ok(());
|
|
}
|
|
|
|
let new = cwd.join(&name);
|
|
if !opt.force
|
|
&& maybe_exists(&new).await
|
|
&& !ConfirmProxy::show(ConfirmCfg::overwrite(&new)).await
|
|
{
|
|
return Ok(());
|
|
}
|
|
|
|
Self::create_do(new, opt.dir || name.ends_with('/') || name.ends_with('\\')).await
|
|
});
|
|
}
|
|
|
|
async fn create_do(new: Url, dir: bool) -> Result<()> {
|
|
let Some(parent) = new.parent_url() else { return Ok(()) };
|
|
let _permit = WATCHER.acquire().await.unwrap();
|
|
|
|
if dir {
|
|
fs::create_dir_all(&new).await?;
|
|
} else if let Ok(real) = symlink_realpath(&new).await {
|
|
ok_or_not_found(fs::remove_file(&new).await)?;
|
|
FilesOp::Deleting(parent.clone(), vec![Url::from(real)]).emit();
|
|
fs::File::create(&new).await?;
|
|
} else {
|
|
fs::create_dir_all(&parent).await.ok();
|
|
ok_or_not_found(fs::remove_file(&new).await)?;
|
|
fs::File::create(&new).await?;
|
|
}
|
|
|
|
if let Ok(f) = File::from(new.clone()).await {
|
|
FilesOp::Upserting(parent, HashMap::from_iter([(f.url_owned(), f)])).emit();
|
|
TabProxy::reveal(&new)
|
|
}
|
|
Ok(())
|
|
}
|
|
}
|