use futures::executor::block_on; use hashbrown::HashSet; use yazi_fs::{CWD, path::clean_url}; use yazi_shared::{strand::StrandBuf, url::{UrlBuf, UrlLike}}; use yazi_vfs::provider; #[derive(Debug, Default)] pub struct Boot { pub cwds: Vec, pub files: Vec, pub local_events: HashSet, pub remote_events: HashSet, } impl Boot { async fn parse_entries(entries: &[UrlBuf]) -> (Vec, Vec) { if entries.is_empty() { return (vec![CWD.load().as_ref().clone()], vec![Default::default()]); } async fn go(entry: &UrlBuf) -> (UrlBuf, StrandBuf) { let mut entry = clean_url(entry); if let Ok(u) = provider::absolute(&entry).await && u.is_owned() { entry = u.into_owned(); } let Some((parent, child)) = entry.pair() else { return (entry, Default::default()); }; if provider::metadata(&entry).await.is_ok_and(|m| m.is_file()) { (parent.into(), child.into()) } else { (entry, Default::default()) } } futures::future::join_all(entries.iter().map(go)).await.into_iter().unzip() } } impl From<&crate::Args> for Boot { fn from(args: &crate::Args) -> Self { let (cwds, files) = block_on(Self::parse_entries(&args.entries)); let local_events = args .local_events .as_ref() .map(|s| s.split(',').map(|s| s.to_owned()).collect()) .unwrap_or_default(); let remote_events = args .remote_events .as_ref() .map(|s| s.split(',').map(|s| s.to_owned()).collect()) .unwrap_or_default(); Self { cwds, files, local_events, remote_events } } }