pub mod builder;
mod convert;
pub mod other_fields;
use std::io;
use bstr::{BStr, BString};
use noodles_core::Position;
pub use self::{builder::Builder, other_fields::OtherFields};
use crate::feature::record::Strand;
#[derive(Clone, Debug, Eq, PartialEq)]
struct StandardFields<const N: usize> {
reference_sequence_name: BString,
feature_start: Position,
feature_end: Option<Position>,
name: Option<BString>,
score: u16,
strand: Option<Strand>,
}
impl<const N: usize> StandardFields<N> {
const fn len(&self) -> usize {
N
}
}
impl<const N: usize> Default for StandardFields<N> {
fn default() -> Self {
Self {
reference_sequence_name: BString::default(),
feature_start: Position::MIN,
feature_end: None,
name: None,
score: 0,
strand: None,
}
}
}
#[derive(Clone, Default, Debug, PartialEq)]
pub struct RecordBuf<const N: usize> {
standard_fields: StandardFields<N>,
other_fields: OtherFields,
}
impl<const N: usize> RecordBuf<N> {
pub fn builder() -> Builder<N> {
Builder::default()
}
pub const fn standard_field_count(&self) -> usize {
self.standard_fields.len()
}
pub fn other_fields(&self) -> &OtherFields {
&self.other_fields
}
}
impl RecordBuf<3> {
pub fn reference_sequence_name(&self) -> &BStr {
self.standard_fields.reference_sequence_name.as_ref()
}
pub fn reference_sequence_name_mut(&mut self) -> &mut BString {
&mut self.standard_fields.reference_sequence_name
}
pub fn feature_start(&self) -> Position {
self.standard_fields.feature_start
}
pub fn feature_start_mut(&mut self) -> &mut Position {
&mut self.standard_fields.feature_start
}
pub fn feature_end(&self) -> Option<Position> {
self.standard_fields.feature_end
}
pub fn feature_end_mut(&mut self) -> &mut Option<Position> {
&mut self.standard_fields.feature_end
}
}
impl super::Record<3> for RecordBuf<3> {
fn reference_sequence_name(&self) -> &BStr {
self.reference_sequence_name()
}
fn feature_start(&self) -> io::Result<Position> {
Ok(self.feature_start())
}
fn feature_end(&self) -> Option<io::Result<Position>> {
self.feature_end().map(Ok)
}
fn name(&self) -> Option<Option<&BStr>> {
None
}
fn score(&self) -> Option<io::Result<u16>> {
None
}
fn strand(&self) -> Option<io::Result<Option<Strand>>> {
None
}
fn other_fields(&self) -> Box<dyn super::record::OtherFields + '_> {
Box::new(self.other_fields())
}
}
impl RecordBuf<4> {
pub fn reference_sequence_name(&self) -> &BStr {
self.standard_fields.reference_sequence_name.as_ref()
}
pub fn reference_sequence_name_mut(&mut self) -> &mut BString {
&mut self.standard_fields.reference_sequence_name
}
pub fn feature_start(&self) -> Position {
self.standard_fields.feature_start
}
pub fn feature_start_mut(&mut self) -> &mut Position {
&mut self.standard_fields.feature_start
}
pub fn feature_end(&self) -> Option<Position> {
self.standard_fields.feature_end
}
pub fn feature_end_mut(&mut self) -> &mut Option<Position> {
&mut self.standard_fields.feature_end
}
pub fn name(&self) -> Option<&BStr> {
self.standard_fields.name.as_ref().map(|name| name.as_ref())
}
pub fn name_mut(&mut self) -> &mut Option<BString> {
&mut self.standard_fields.name
}
}
impl super::Record<4> for RecordBuf<4> {
fn reference_sequence_name(&self) -> &BStr {
self.reference_sequence_name()
}
fn feature_start(&self) -> io::Result<Position> {
Ok(self.feature_start())
}
fn feature_end(&self) -> Option<io::Result<Position>> {
self.feature_end().map(Ok)
}
fn name(&self) -> Option<Option<&BStr>> {
Some(self.name())
}
fn score(&self) -> Option<io::Result<u16>> {
None
}
fn strand(&self) -> Option<io::Result<Option<Strand>>> {
None
}
fn other_fields(&self) -> Box<dyn super::record::OtherFields + '_> {
Box::new(self.other_fields())
}
}
impl RecordBuf<5> {
pub fn reference_sequence_name(&self) -> &BStr {
self.standard_fields.reference_sequence_name.as_ref()
}
pub fn reference_sequence_name_mut(&mut self) -> &mut BString {
&mut self.standard_fields.reference_sequence_name
}
pub fn feature_start(&self) -> Position {
self.standard_fields.feature_start
}
pub fn feature_start_mut(&mut self) -> &mut Position {
&mut self.standard_fields.feature_start
}
pub fn feature_end(&self) -> Option<Position> {
self.standard_fields.feature_end
}
pub fn feature_end_mut(&mut self) -> &mut Option<Position> {
&mut self.standard_fields.feature_end
}
pub fn name(&self) -> Option<&BStr> {
self.standard_fields.name.as_ref().map(|name| name.as_ref())
}
pub fn name_mut(&mut self) -> &mut Option<BString> {
&mut self.standard_fields.name
}
pub fn score(&self) -> u16 {
self.standard_fields.score
}
pub fn score_mut(&mut self) -> &mut u16 {
&mut self.standard_fields.score
}
}
impl super::Record<5> for RecordBuf<5> {
fn reference_sequence_name(&self) -> &BStr {
self.reference_sequence_name()
}
fn feature_start(&self) -> io::Result<Position> {
Ok(self.feature_start())
}
fn feature_end(&self) -> Option<io::Result<Position>> {
self.feature_end().map(Ok)
}
fn name(&self) -> Option<Option<&BStr>> {
Some(self.name())
}
fn score(&self) -> Option<io::Result<u16>> {
Some(Ok(self.score()))
}
fn strand(&self) -> Option<io::Result<Option<Strand>>> {
None
}
fn other_fields(&self) -> Box<dyn super::record::OtherFields + '_> {
Box::new(self.other_fields())
}
}
impl RecordBuf<6> {
pub fn reference_sequence_name(&self) -> &BStr {
self.standard_fields.reference_sequence_name.as_ref()
}
pub fn reference_sequence_name_mut(&mut self) -> &mut BString {
&mut self.standard_fields.reference_sequence_name
}
pub fn feature_start(&self) -> Position {
self.standard_fields.feature_start
}
pub fn feature_start_mut(&mut self) -> &mut Position {
&mut self.standard_fields.feature_start
}
pub fn feature_end(&self) -> Option<Position> {
self.standard_fields.feature_end
}
pub fn feature_end_mut(&mut self) -> &mut Option<Position> {
&mut self.standard_fields.feature_end
}
pub fn name(&self) -> Option<&BStr> {
self.standard_fields.name.as_ref().map(|name| name.as_ref())
}
pub fn name_mut(&mut self) -> &mut Option<BString> {
&mut self.standard_fields.name
}
pub fn score(&self) -> u16 {
self.standard_fields.score
}
pub fn score_mut(&mut self) -> &mut u16 {
&mut self.standard_fields.score
}
pub fn strand(&self) -> Option<Strand> {
self.standard_fields.strand
}
pub fn strand_mut(&mut self) -> &mut Option<Strand> {
&mut self.standard_fields.strand
}
}
impl super::Record<6> for RecordBuf<6> {
fn reference_sequence_name(&self) -> &BStr {
self.reference_sequence_name()
}
fn feature_start(&self) -> io::Result<Position> {
Ok(self.feature_start())
}
fn feature_end(&self) -> Option<io::Result<Position>> {
self.feature_end().map(Ok)
}
fn name(&self) -> Option<Option<&BStr>> {
Some(self.name())
}
fn score(&self) -> Option<io::Result<u16>> {
Some(Ok(self.score()))
}
fn strand(&self) -> Option<io::Result<Option<Strand>>> {
Some(Ok(self.strand()))
}
fn other_fields(&self) -> Box<dyn super::record::OtherFields + '_> {
Box::new(self.other_fields())
}
}