use std::path::Path;
use crate::{GRangesError, Position};
pub fn parse_column<T: std::str::FromStr>(column: &str, line: &str) -> Result<T, GRangesError>
where
<T as std::str::FromStr>::Err: std::fmt::Debug,
{
column
.parse::<T>()
.map_err(|_| GRangesError::InvalidColumnType {
expected_type: std::any::type_name::<T>().to_string(), found_value: column.to_string(),
line: line.to_string(),
})
}
pub fn parse_bedlike(line: &str) -> Result<(String, Position, Position, Vec<&str>), GRangesError> {
let columns: Vec<&str> = line.split('\t').collect();
if columns.len() < 3 {
return Err(GRangesError::BedTooFewColumns(
columns.len(),
3,
line.to_string(),
));
}
let seqname = parse_column(columns[0], line)?;
let start: Position = parse_column(columns[1], line)?;
let end: Position = parse_column(columns[2], line)?;
let additional_columns = columns[3..].to_vec();
Ok((seqname, start, end, additional_columns))
}
pub fn get_base_extension<P: AsRef<Path>>(filepath: P) -> Option<String> {
let path = filepath.as_ref();
let parts: Vec<&str> = path
.file_name()
.and_then(|name| name.to_str())
.unwrap_or("")
.split('.')
.collect();
let ignore_extensions = ["gz", "bgz"];
let has_ignore_extension = parts
.last()
.map_or(false, |ext| ignore_extensions.contains(ext));
if parts.len() > 2 && has_ignore_extension {
Some(parts[parts.len() - 2].to_string())
} else if parts.len() > 1 {
Some(parts[parts.len() - 1].to_string())
} else {
None
}
}
#[cfg(test)]
mod tests {
use super::get_base_extension;
#[test]
fn test_get_base_extension() {
assert_eq!(get_base_extension("test.bed.gz").unwrap(), "bed");
assert_eq!(get_base_extension("test.bed").unwrap(), "bed");
assert_eq!(get_base_extension("some/path/test.bed.gz").unwrap(), "bed");
assert_eq!(get_base_extension("some/path/test.bed").unwrap(), "bed");
assert_eq!(get_base_extension("some/path/test.gff").unwrap(), "gff");
assert_eq!(get_base_extension("some/path/test.gff.gz").unwrap(), "gff");
assert_eq!(get_base_extension("test.gff.gz").unwrap(), "gff");
assert_eq!(get_base_extension("test.gff").unwrap(), "gff");
assert_eq!(get_base_extension("test"), None);
assert_eq!(get_base_extension("foo/test"), None);
}
}