use helix_core::Position; use std::path::{Path, PathBuf}; /// Parse arg into [`PathBuf`] and position. pub fn parse_file(s: &str) -> (PathBuf, Position) { let def = || (PathBuf::from(s), Position::default()); if Path::new(s).exists() { return def(); } split_path_row_col(s) .or_else(|| split_path_row(s)) .unwrap_or_else(def) } /// Split file.rs:10:2 into [`PathBuf`], row and col. /// /// Does not validate if file.rs is a file or directory. fn split_path_row_col(s: &str) -> Option<(PathBuf, Position)> { let mut s = s.rsplitn(3, ':'); let col: usize = s.next()?.parse().ok()?; let row: usize = s.next()?.parse().ok()?; let path = s.next()?.into(); let pos = Position::new(row.saturating_sub(1), col.saturating_sub(1)); Some((path, pos)) } /// Split file.rs:10 into [`PathBuf`] and row. /// /// Does not validate if file.rs is a file or directory. fn split_path_row(s: &str) -> Option<(PathBuf, Position)> { let (path, row) = s.rsplit_once(':')?; let row: usize = row.parse().ok()?; let path = path.into(); let pos = Position::new(row.saturating_sub(1), 0); Some((path, pos)) }