use std::fmt;
use crate::granges::GRanges;
use crate::meta_row::{MetaRow, MetaRowValue};
use crate::range::Range;
pub struct GRange {
pub seqname: String,
pub range: Range,
pub strand: char,
}
impl GRange {
pub fn new(seqname: String, from: usize, to: usize, strand: char) -> Self {
GRange {
seqname,
range: Range::new(from, to),
strand,
}
}
}
pub struct GRangesRow<'a> {
granges: &'a GRanges,
row: usize,
}
impl<'a> GRangesRow<'a> {
pub fn new(granges: &'a GRanges, row: usize) -> Self {
GRangesRow { granges, row }
}
pub fn seqname(&self) -> &String {
&self.granges.seqnames[self.row]
}
pub fn range(&self) -> &Range {
&self.granges.ranges[self.row]
}
pub fn strand(&self) -> char {
self.granges.strand[self.row]
}
pub fn meta(&self) -> MetaRow<'a> {
self.granges.meta.row(self.row)
}
pub fn get_meta(&self, name: &str) -> Option<MetaRowValue<'a>> {
self.meta().get_meta(name)
}
pub fn get_meta_str(&self, name: &str) -> Option<&'a str> {
self.meta().get_meta_str(name)
}
pub fn get_meta_strs(&self, name: &str) -> Option<&'a [String]> {
self.meta().get_meta_strs(name)
}
pub fn get_meta_float(&self, name: &str) -> Option<f64> {
self.meta().get_meta_float(name)
}
pub fn get_meta_floats(&self, name: &str) -> Option<&'a [f64]> {
self.meta().get_meta_floats(name)
}
pub fn get_meta_int(&self, name: &str) -> Option<i64> {
self.meta().get_meta_int(name)
}
pub fn get_meta_ints(&self, name: &str) -> Option<&'a [i64]> {
self.meta().get_meta_ints(name)
}
pub fn get_meta_range(&self, name: &str) -> Option<Range> {
self.meta().get_meta_range(name)
}
}
impl<'a> fmt::Display for GRangesRow<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(
f,
"GRangesRow(seqname={}, range=({}, {}), strand={})",
self.granges.seqnames[self.row],
self.granges.ranges[self.row].from,
self.granges.ranges[self.row].to,
self.granges.strand[self.row] as char
)
}
}