···
+
use crate::dna::DnaIterator;
use crate::pattern::Pattern;
use crate::pattern::PatternItem;
use crate::template::Template;
use crate::template::TemplateItem;
pub fn new(buf: &'a DnaRef) -> Parser<'a> {
pub fn index(&self) -> usize {
+
fn peek_to(&mut self, n: usize) {
+
while self.peeked.len() < n {
+
if let Some(b) = self.iter.next() {
+
pub fn next_is(&mut self, next: &[Base]) -> bool {
+
self.peek_to(next.len());
+
if self.peeked.len() < next.len() {
+
return &self.peeked[..next.len()] == next;
+
pub fn advance(&mut self, n: usize) {
+
self.peeked.drain(..n);
pub fn nat(&mut self) -> Option<usize> {
···
if self.next_is(&[Base::P]) {
} else if self.next_is(&[Base::I]) || self.next_is(&[Base::F]) {
} else if self.next_is(&[Base::C]) {
···
let mut ret = Vec::new();
if self.next_is(&[Base::C]) {
} else if self.next_is(&[Base::F]) {
} else if self.next_is(&[Base::P]) {
} else if self.next_is(&[Base::I, Base::C]) {
···
if self.next_is(&[Base::C]) {
ret.push(PatternItem::Base(Base::I));
} else if self.next_is(&[Base::F]) {
ret.push(PatternItem::Base(Base::C));
} else if self.next_is(&[Base::P]) {
ret.push(PatternItem::Base(Base::F));
} else if self.next_is(&[Base::I, Base::C]) {
ret.push(PatternItem::Base(Base::P));
} else if self.next_is(&[Base::I, Base::P]) {
ret.push(PatternItem::Skip(n));
} else if self.next_is(&[Base::I, Base::F]) {
ret.push(PatternItem::Search(s));
} else if self.next_is(&[Base::I, Base::I, Base::P]) {
ret.push(PatternItem::Open);
} else if self.next_is(&[Base::I, Base::I, Base::C])
|| self.next_is(&[Base::I, Base::I, Base::F])
ret.push(PatternItem::Close);
} else if self.next_is(&[Base::I, Base::I, Base::I]) {
+
let mut r = Vec::new();
+
mem::swap(&mut r, &mut self.peeked);
+
rna.push(r.try_into().unwrap());
···
let mut ret = Vec::new();
if self.next_is(&[Base::C]) {
ret.push(TemplateItem::Base(Base::I));
} else if self.next_is(&[Base::F]) {
ret.push(TemplateItem::Base(Base::C));
} else if self.next_is(&[Base::P]) {
ret.push(TemplateItem::Base(Base::F));
} else if self.next_is(&[Base::I, Base::C]) {
ret.push(TemplateItem::Base(Base::P));
} else if self.next_is(&[Base::I, Base::P]) || self.next_is(&[Base::I, Base::F]) {
ret.push(TemplateItem::Ref(n, l));
} else if self.next_is(&[Base::I, Base::I, Base::C])
|| self.next_is(&[Base::I, Base::I, Base::F])
} else if self.next_is(&[Base::I, Base::I, Base::P]) {
ret.push(TemplateItem::Len(n));
} else if self.next_is(&[Base::I, Base::I, Base::I]) {
+
let mut r = Vec::new();
+
mem::swap(&mut r, &mut self.peeked);
+
rna.push(r.try_into().unwrap());