mirror of
https://github.com/sxyazi/yazi.git
synced 2026-07-25 08:41:05 +00:00
Simplify the code
This commit is contained in:
parent
41554b8f61
commit
ff08618325
1 changed files with 37 additions and 79 deletions
|
|
@ -9,53 +9,44 @@ use yazi_shared::{event::Exec, fs::{max_common_root, File, FilesOp, Url}, term::
|
||||||
|
|
||||||
use crate::{input::Input, manager::Manager};
|
use crate::{input::Input, manager::Manager};
|
||||||
|
|
||||||
enum EmptyOpt {
|
pub struct Opt<'a> {
|
||||||
None,
|
|
||||||
All,
|
|
||||||
Name,
|
|
||||||
Ext,
|
|
||||||
DotExt,
|
|
||||||
}
|
|
||||||
|
|
||||||
enum CursorOpt {
|
|
||||||
None,
|
|
||||||
Append,
|
|
||||||
Prepend,
|
|
||||||
}
|
|
||||||
|
|
||||||
pub struct Opt {
|
|
||||||
force: bool,
|
force: bool,
|
||||||
empty: EmptyOpt,
|
empty: &'a str,
|
||||||
cursor: CursorOpt,
|
cursor: &'a str,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<&Exec> for Opt {
|
impl<'a> From<&'a Exec> for Opt<'a> {
|
||||||
fn from(e: &Exec) -> Self {
|
fn from(e: &'a Exec) -> Self {
|
||||||
Self {
|
Self {
|
||||||
force: e.named.contains_key("force"),
|
force: e.named.contains_key("force"),
|
||||||
empty: match e.named.get("empty").map(|s| s.as_str()).unwrap_or_default() {
|
empty: e.named.get("empty").map(|s| s.as_str()).unwrap_or_default(),
|
||||||
"all" => EmptyOpt::All,
|
cursor: e.named.get("cursor").map(|s| s.as_str()).unwrap_or_default(),
|
||||||
"name" => EmptyOpt::Name,
|
|
||||||
"ext" => EmptyOpt::Ext,
|
|
||||||
"dot-ext" => EmptyOpt::DotExt,
|
|
||||||
_ => EmptyOpt::None,
|
|
||||||
},
|
|
||||||
cursor: match e.named.get("cursor").map(|s| s.as_str()).unwrap_or_default() {
|
|
||||||
"append" => CursorOpt::Append,
|
|
||||||
"prepend" => CursorOpt::Prepend,
|
|
||||||
_ => CursorOpt::None,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_parts_and_len(s: &str) -> (Vec<&str>, usize) {
|
|
||||||
let parts: Vec<_> = s.split('.').collect();
|
|
||||||
let len = parts.len();
|
|
||||||
(parts, len)
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Manager {
|
impl Manager {
|
||||||
|
fn empty_url_part(url: &Url, by: &str) -> String {
|
||||||
|
if by == "all" {
|
||||||
|
return String::new();
|
||||||
|
}
|
||||||
|
|
||||||
|
let ext = url.extension();
|
||||||
|
match by {
|
||||||
|
"name" => {
|
||||||
|
return ext.map_or_else(String::new, |s| s.to_string_lossy().to_string());
|
||||||
|
}
|
||||||
|
"ext" if ext.is_some() => {
|
||||||
|
return format!("{}.", url.file_stem().unwrap().to_string_lossy());
|
||||||
|
}
|
||||||
|
"dot_ext" if ext.is_some() => {
|
||||||
|
return url.file_stem().unwrap().to_string_lossy().to_string();
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
|
url.file_name().map_or_else(String::new, |s| s.to_string_lossy().to_string())
|
||||||
|
}
|
||||||
|
|
||||||
async fn rename_and_hover(old: Url, new: Url) -> Result<()> {
|
async fn rename_and_hover(old: Url, new: Url) -> Result<()> {
|
||||||
fs::rename(&old, &new).await?;
|
fs::rename(&old, &new).await?;
|
||||||
if old.parent() != new.parent() {
|
if old.parent() != new.parent() {
|
||||||
|
|
@ -67,7 +58,7 @@ impl Manager {
|
||||||
Ok(Self::_hover(Some(new)))
|
Ok(Self::_hover(Some(new)))
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn rename(&self, opt: impl Into<Opt>) {
|
pub fn rename<'a>(&self, opt: impl Into<Opt<'a>>) {
|
||||||
if self.active().in_selecting() {
|
if self.active().in_selecting() {
|
||||||
return self.bulk_rename();
|
return self.bulk_rename();
|
||||||
}
|
}
|
||||||
|
|
@ -77,48 +68,15 @@ impl Manager {
|
||||||
};
|
};
|
||||||
|
|
||||||
let opt = opt.into() as Opt;
|
let opt = opt.into() as Opt;
|
||||||
tokio::spawn(async move {
|
let name = Self::empty_url_part(&hovered, opt.empty);
|
||||||
let full_name = hovered.file_name().unwrap().to_string_lossy();
|
|
||||||
|
|
||||||
let initial_name = match &opt.empty {
|
|
||||||
EmptyOpt::None => full_name.into(),
|
|
||||||
EmptyOpt::All => "".into(),
|
|
||||||
EmptyOpt::Name => {
|
|
||||||
let ext = full_name.split('.').last().unwrap_or_default();
|
|
||||||
if ext == &full_name {
|
|
||||||
"".into()
|
|
||||||
} else {
|
|
||||||
format!(".{ext}")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
x => {
|
|
||||||
let (name_parts, len) = get_parts_and_len(&full_name);
|
|
||||||
if len > 1 {
|
|
||||||
let partial_name = name_parts[..len - 1].join(".");
|
|
||||||
match x {
|
|
||||||
EmptyOpt::Ext => format!("{partial_name}."),
|
|
||||||
EmptyOpt::DotExt => partial_name,
|
|
||||||
_ => panic!() // impossible
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
full_name.into()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
let cursor = match opt.cursor {
|
let cursor = match opt.cursor {
|
||||||
CursorOpt::Append => None,
|
"start" => Some(0),
|
||||||
CursorOpt::Prepend => Some(0),
|
"before_ext" => name.rfind('.').filter(|&n| n != 0),
|
||||||
CursorOpt::None => match opt.empty {
|
_ => None,
|
||||||
EmptyOpt::None => {
|
|
||||||
let (name_parts, len) = get_parts_and_len(&initial_name);
|
|
||||||
Some(name_parts[..len - 1].join(".").len())
|
|
||||||
}
|
|
||||||
_ => None
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut result = Input::_show(InputCfg::rename().with_value(initial_name).with_cursor(cursor));
|
tokio::spawn(async move {
|
||||||
|
let mut result = Input::_show(InputCfg::rename().with_value(name).with_cursor(cursor));
|
||||||
let Some(Ok(name)) = result.recv().await else {
|
let Some(Ok(name)) = result.recv().await else {
|
||||||
return;
|
return;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue