use std::borrow::Cow;
use std::fmt;
#[derive(Copy, Clone, PartialEq, Hash, Eq)]
pub enum AnchorActive {
A,
G,
AG,
None,
}
impl AnchorActive {
pub fn new(is_first_line: bool, anchor_position: Option<usize>, current_pos: usize) -> Self {
let g_active = if let Some(a_pos) = anchor_position {
a_pos == current_pos
} else {
false
};
if is_first_line {
if g_active {
AnchorActive::AG
} else {
AnchorActive::A
}
} else if g_active {
AnchorActive::G
} else {
AnchorActive::None
}
}
pub fn replace_anchors<'a>(&self, pat: &'a str) -> Cow<'a, str> {
match self {
AnchorActive::AG => {
Cow::Borrowed(pat)
}
AnchorActive::A => {
if pat.contains("\\G") {
Cow::Owned(pat.replace("\\G", "\u{FFFF}"))
} else {
Cow::Borrowed(pat)
}
}
AnchorActive::G => {
if pat.contains("\\A") {
Cow::Owned(pat.replace("\\A", "\u{FFFF}"))
} else {
Cow::Borrowed(pat)
}
}
AnchorActive::None => {
if pat.contains("\\A") || pat.contains("\\G") {
Cow::Owned(pat.replace("\\A", "\u{FFFF}").replace("\\G", "\u{FFFF}"))
} else {
Cow::Borrowed(pat)
}
}
}
}
}
impl fmt::Debug for AnchorActive {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let s = match self {
AnchorActive::A => "allow_A=true, allow_G=false",
AnchorActive::G => "allow_A=false, allow_G=true",
AnchorActive::AG => "allow_A=true, allow_G=true",
AnchorActive::None => "allow_A=false, allow_G=false",
};
f.write_str(s)
}
}