Simplify the code

This commit is contained in:
sxyazi 2024-01-15 22:53:35 +08:00
parent 41554b8f61
commit ff08618325
No known key found for this signature in database

View file

@ -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;
}; };