mod other;
mod standard;
use std::{
borrow::Borrow,
error, fmt,
hash::{Hash, Hasher},
str::FromStr,
};
pub use self::{other::Other, standard::Standard};
use crate::header::FileFormat;
pub const ANCESTRAL_ALLELE: Key = Key::Standard(Standard::AncestralAllele);
pub const ALLELE_COUNT: Key = Key::Standard(Standard::AlleleCount);
pub const TOTAL_READ_DEPTHS: Key = Key::Standard(Standard::TotalReadDepths);
pub const FORWARD_STRAND_READ_DEPTHS: Key = Key::Standard(Standard::ForwardStrandReadDepths);
pub const REVERSE_STRAND_READ_DEPTHS: Key = Key::Standard(Standard::ReverseStrandReadDepths);
pub const ALLELE_FREQUENCIES: Key = Key::Standard(Standard::AlleleFrequencies);
pub const TOTAL_ALLELE_COUNT: Key = Key::Standard(Standard::TotalAlleleCount);
pub const BASE_QUALITY: Key = Key::Standard(Standard::BaseQuality);
pub const CIGAR: Key = Key::Standard(Standard::Cigar);
pub const IS_IN_DB_SNP: Key = Key::Standard(Standard::IsInDbSnp);
pub const TOTAL_DEPTH: Key = Key::Standard(Standard::TotalDepth);
pub const IS_IN_HAP_MAP_2: Key = Key::Standard(Standard::IsInHapMap2);
pub const IS_IN_HAP_MAP_3: Key = Key::Standard(Standard::IsInHapMap3);
pub const MAPPING_QUALITY: Key = Key::Standard(Standard::MappingQuality);
pub const ZERO_MAPPING_QUALITY_COUNT: Key = Key::Standard(Standard::ZeroMappingQualityCount);
pub const SAMPLES_WITH_DATA_COUNT: Key = Key::Standard(Standard::SamplesWithDataCount);
pub const STRAND_BIAS: Key = Key::Standard(Standard::StrandBias);
pub const IS_SOMATIC_MUTATION: Key = Key::Standard(Standard::IsSomaticMutation);
pub const IS_VALIDATED: Key = Key::Standard(Standard::IsValidated);
pub const IS_IN_1000_GENOMES: Key = Key::Standard(Standard::IsIn1000Genomes);
pub const IS_IMPRECISE: Key = Key::Standard(Standard::IsImprecise);
pub const IS_NOVEL: Key = Key::Standard(Standard::IsNovel);
pub const END_POSITION: Key = Key::Standard(Standard::EndPosition);
pub const SV_TYPE: Key = Key::Standard(Standard::SvType);
pub const SV_LENGTHS: Key = Key::Standard(Standard::SvLengths);
pub const POSITION_CONFIDENCE_INTERVALS: Key = Key::Standard(Standard::PositionConfidenceIntervals);
pub const END_CONFIDENCE_INTERVALS: Key = Key::Standard(Standard::EndConfidenceIntervals);
pub const MICROHOMOLOGY_LENGTHS: Key = Key::Standard(Standard::MicrohomologyLengths);
pub const MICROHOMOLOGY_SEQUENCES: Key = Key::Standard(Standard::MicrohomologySequences);
pub const BREAKPOINT_IDS: Key = Key::Standard(Standard::BreakpointIds);
pub const MOBILE_ELEMENT_INFO: Key = Key::Standard(Standard::MobileElementInfo);
pub const MOBILE_ELEMENT_TRANSDUCTION_INFO: Key =
Key::Standard(Standard::MobileElementTransductionInfo);
pub const DBV_ID: Key = Key::Standard(Standard::DbvId);
pub const DB_VAR_ID: Key = Key::Standard(Standard::DbVarId);
pub const DB_RIP_ID: Key = Key::Standard(Standard::DbRipId);
pub const MATE_BREAKEND_IDS: Key = Key::Standard(Standard::MateBreakendIds);
pub const PARTNER_BREAKEND_ID: Key = Key::Standard(Standard::PartnerBreakendId);
pub const BREAKEND_EVENT_ID: Key = Key::Standard(Standard::BreakendEventId);
pub const EVENT_TYPE: Key = Key::Standard(Standard::EventType);
pub const BREAKEND_CONFIDENCE_INTERVALS: Key = Key::Standard(Standard::BreakendConfidenceIntervals);
pub const ADJACENT_READ_DEPTHS: Key = Key::Standard(Standard::AdjacentReadDepths);
pub const BREAKEND_COPY_NUMBER: Key = Key::Standard(Standard::BreakendCopyNumber);
pub const ADJACENT_COPY_NUMBER: Key = Key::Standard(Standard::AdjacentCopyNumber);
pub const COPY_NUMBER_CONFIDENCE_INTERVALS: Key =
Key::Standard(Standard::CopyNumberConfidenceIntervals);
pub const ADJACENT_COPY_NUMBER_CONFIDENCE_INTERVALS: Key =
Key::Standard(Standard::AdjacentCopyNumberConfidenceIntervals);
pub const SV_CLAIM: Key = Key::Standard(Standard::SvClaim);
pub const TOTAL_REPEAT_SEQUENCE_COUNTS: Key = Key::Standard(Standard::TotalRepeatSequenceCounts);
pub const REPEAT_UNIT_SEQUENCES: Key = Key::Standard(Standard::RepeatUnitSequences);
pub const REPEAT_UNIT_LENGTHS: Key = Key::Standard(Standard::RepeatUnitLengths);
pub const REPEAT_UNIT_COUNTS: Key = Key::Standard(Standard::RepeatUnitCounts);
pub const TOTAL_REPEAT_SEQUENCE_BASE_COUNTS: Key =
Key::Standard(Standard::TotalRepeatSequenceBaseCounts);
pub const REPEAT_UNIT_COUNT_CONFIDENCE_INTERVALS: Key =
Key::Standard(Standard::RepeatUnitCountConfidenceIntervals);
pub const TOTAL_REPEAT_SEQUENCE_BASE_COUNT_CONFIDENCE_INTERVALS: Key =
Key::Standard(Standard::TotalRepeatSequenceBaseCountConfidenceIntervals);
pub const REPEAT_UNIT_BASE_COUNTS: Key = Key::Standard(Standard::RepeatUnitBaseCounts);
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum ParseError {
Empty,
Invalid,
}
impl error::Error for ParseError {}
impl fmt::Display for ParseError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Self::Empty => f.write_str("empty input"),
Self::Invalid => f.write_str("invalid input"),
}
}
}
#[derive(Clone, Debug, Eq, PartialEq)]
pub enum Key {
Standard(Standard),
Other(Other),
}
impl AsRef<str> for Key {
fn as_ref(&self) -> &str {
match self {
Self::Standard(k) => k.as_ref(),
Self::Other(k) => k.as_ref(),
}
}
}
impl Borrow<str> for Key {
fn borrow(&self) -> &str {
self.as_ref()
}
}
impl fmt::Display for Key {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(self.as_ref())
}
}
impl FromStr for Key {
type Err = ParseError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
if s.is_empty() {
return Err(ParseError::Empty);
}
s.parse()
.map(Self::Standard)
.or_else(|_| s.parse().map(Self::Other))
}
}
impl Hash for Key {
fn hash<H: Hasher>(&self, state: &mut H) {
self.as_ref().hash(state)
}
}
impl TryFrom<(FileFormat, &str)> for Key {
type Error = ParseError;
fn try_from((file_format, s): (FileFormat, &str)) -> Result<Self, Self::Error> {
if s.is_empty() {
return Err(ParseError::Empty);
}
s.parse()
.map(Self::Standard)
.or_else(|_| Other::try_from((file_format, s)).map(Self::Other))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_fmt() {
assert_eq!(ANCESTRAL_ALLELE.to_string(), "AA");
assert_eq!(ALLELE_COUNT.to_string(), "AC");
assert_eq!(TOTAL_READ_DEPTHS.to_string(), "AD");
assert_eq!(FORWARD_STRAND_READ_DEPTHS.to_string(), "ADF");
assert_eq!(REVERSE_STRAND_READ_DEPTHS.to_string(), "ADR");
assert_eq!(ALLELE_FREQUENCIES.to_string(), "AF");
assert_eq!(TOTAL_ALLELE_COUNT.to_string(), "AN");
assert_eq!(BASE_QUALITY.to_string(), "BQ");
assert_eq!(CIGAR.to_string(), "CIGAR");
assert_eq!(IS_IN_DB_SNP.to_string(), "DB");
assert_eq!(TOTAL_DEPTH.to_string(), "DP");
assert_eq!(IS_IN_HAP_MAP_2.to_string(), "H2");
assert_eq!(IS_IN_HAP_MAP_3.to_string(), "H3");
assert_eq!(MAPPING_QUALITY.to_string(), "MQ");
assert_eq!(ZERO_MAPPING_QUALITY_COUNT.to_string(), "MQ0");
assert_eq!(SAMPLES_WITH_DATA_COUNT.to_string(), "NS");
assert_eq!(STRAND_BIAS.to_string(), "SB");
assert_eq!(IS_SOMATIC_MUTATION.to_string(), "SOMATIC");
assert_eq!(IS_VALIDATED.to_string(), "VALIDATED");
assert_eq!(IS_IN_1000_GENOMES.to_string(), "1000G");
assert_eq!(IS_IMPRECISE.to_string(), "IMPRECISE");
assert_eq!(IS_NOVEL.to_string(), "NOVEL");
assert_eq!(END_POSITION.to_string(), "END");
assert_eq!(SV_TYPE.to_string(), "SVTYPE");
assert_eq!(SV_LENGTHS.to_string(), "SVLEN");
assert_eq!(POSITION_CONFIDENCE_INTERVALS.to_string(), "CIPOS");
assert_eq!(END_CONFIDENCE_INTERVALS.to_string(), "CIEND");
assert_eq!(MICROHOMOLOGY_LENGTHS.to_string(), "HOMLEN");
assert_eq!(MICROHOMOLOGY_SEQUENCES.to_string(), "HOMSEQ");
assert_eq!(BREAKPOINT_IDS.to_string(), "BKPTID");
assert_eq!(MOBILE_ELEMENT_INFO.to_string(), "MEINFO");
assert_eq!(MOBILE_ELEMENT_TRANSDUCTION_INFO.to_string(), "METRANS");
assert_eq!(DBV_ID.to_string(), "DGVID");
assert_eq!(DB_VAR_ID.to_string(), "DBVARID");
assert_eq!(DB_RIP_ID.to_string(), "DBRIPID");
assert_eq!(MATE_BREAKEND_IDS.to_string(), "MATEID");
assert_eq!(PARTNER_BREAKEND_ID.to_string(), "PARID");
assert_eq!(BREAKEND_EVENT_ID.to_string(), "EVENT");
assert_eq!(BREAKEND_CONFIDENCE_INTERVALS.to_string(), "CILEN");
assert_eq!(ADJACENT_READ_DEPTHS.to_string(), "DPADJ");
assert_eq!(BREAKEND_COPY_NUMBER.to_string(), "CN");
assert_eq!(ADJACENT_COPY_NUMBER.to_string(), "CNADJ");
assert_eq!(COPY_NUMBER_CONFIDENCE_INTERVALS.to_string(), "CICN");
assert_eq!(
ADJACENT_COPY_NUMBER_CONFIDENCE_INTERVALS.to_string(),
"CICNADJ"
);
assert_eq!(SV_CLAIM.to_string(), "SVCLAIM");
assert_eq!(TOTAL_REPEAT_SEQUENCE_COUNTS.to_string(), "RN");
assert_eq!(REPEAT_UNIT_SEQUENCES.to_string(), "RUS");
assert_eq!(REPEAT_UNIT_LENGTHS.to_string(), "RUL");
assert_eq!(REPEAT_UNIT_COUNTS.to_string(), "RUC");
assert_eq!(TOTAL_REPEAT_SEQUENCE_BASE_COUNTS.to_string(), "RB");
assert_eq!(REPEAT_UNIT_COUNT_CONFIDENCE_INTERVALS.to_string(), "CIRUC");
assert_eq!(
TOTAL_REPEAT_SEQUENCE_BASE_COUNT_CONFIDENCE_INTERVALS.to_string(),
"CIRB"
);
assert_eq!(REPEAT_UNIT_BASE_COUNTS.to_string(), "RUB");
assert_eq!(Key::Other(Other(String::from("NDLS"))).to_string(), "NDLS");
}
#[test]
fn test_from_str() {
assert_eq!("AA".parse(), Ok(ANCESTRAL_ALLELE));
assert_eq!("AC".parse(), Ok(ALLELE_COUNT));
assert_eq!("AD".parse(), Ok(TOTAL_READ_DEPTHS));
assert_eq!("ADF".parse(), Ok(FORWARD_STRAND_READ_DEPTHS));
assert_eq!("ADR".parse(), Ok(REVERSE_STRAND_READ_DEPTHS));
assert_eq!("AF".parse(), Ok(ALLELE_FREQUENCIES));
assert_eq!("AN".parse(), Ok(TOTAL_ALLELE_COUNT));
assert_eq!("BQ".parse(), Ok(BASE_QUALITY));
assert_eq!("CIGAR".parse(), Ok(CIGAR));
assert_eq!("DB".parse(), Ok(IS_IN_DB_SNP));
assert_eq!("DP".parse(), Ok(TOTAL_DEPTH));
assert_eq!("H2".parse(), Ok(IS_IN_HAP_MAP_2));
assert_eq!("H3".parse(), Ok(IS_IN_HAP_MAP_3));
assert_eq!("MQ".parse(), Ok(MAPPING_QUALITY));
assert_eq!("MQ0".parse(), Ok(ZERO_MAPPING_QUALITY_COUNT));
assert_eq!("NS".parse(), Ok(SAMPLES_WITH_DATA_COUNT));
assert_eq!("SB".parse(), Ok(STRAND_BIAS));
assert_eq!("SOMATIC".parse(), Ok(IS_SOMATIC_MUTATION));
assert_eq!("VALIDATED".parse(), Ok(IS_VALIDATED));
assert_eq!("1000G".parse(), Ok(IS_IN_1000_GENOMES));
assert_eq!("IMPRECISE".parse(), Ok(IS_IMPRECISE));
assert_eq!("NOVEL".parse(), Ok(IS_NOVEL));
assert_eq!("END".parse(), Ok(END_POSITION));
assert_eq!("SVTYPE".parse(), Ok(SV_TYPE));
assert_eq!("SVLEN".parse(), Ok(SV_LENGTHS));
assert_eq!("CIPOS".parse(), Ok(POSITION_CONFIDENCE_INTERVALS));
assert_eq!("CIEND".parse(), Ok(END_CONFIDENCE_INTERVALS));
assert_eq!("HOMLEN".parse(), Ok(MICROHOMOLOGY_LENGTHS));
assert_eq!("HOMSEQ".parse(), Ok(MICROHOMOLOGY_SEQUENCES));
assert_eq!("BKPTID".parse(), Ok(BREAKPOINT_IDS));
assert_eq!("MEINFO".parse(), Ok(MOBILE_ELEMENT_INFO));
assert_eq!("METRANS".parse(), Ok(MOBILE_ELEMENT_TRANSDUCTION_INFO));
assert_eq!("DGVID".parse(), Ok(DBV_ID));
assert_eq!("DBVARID".parse(), Ok(DB_VAR_ID));
assert_eq!("DBRIPID".parse(), Ok(DB_RIP_ID));
assert_eq!("MATEID".parse(), Ok(MATE_BREAKEND_IDS));
assert_eq!("PARID".parse(), Ok(PARTNER_BREAKEND_ID));
assert_eq!("EVENT".parse(), Ok(BREAKEND_EVENT_ID));
assert_eq!("EVENTTYPE".parse(), Ok(EVENT_TYPE));
assert_eq!("CILEN".parse(), Ok(BREAKEND_CONFIDENCE_INTERVALS));
assert_eq!("DPADJ".parse(), Ok(ADJACENT_READ_DEPTHS));
assert_eq!("CN".parse(), Ok(BREAKEND_COPY_NUMBER));
assert_eq!("CNADJ".parse(), Ok(ADJACENT_COPY_NUMBER));
assert_eq!("CICN".parse(), Ok(COPY_NUMBER_CONFIDENCE_INTERVALS));
assert_eq!(
"CICNADJ".parse(),
Ok(ADJACENT_COPY_NUMBER_CONFIDENCE_INTERVALS)
);
assert_eq!("SVCLAIM".parse(), Ok(SV_CLAIM));
assert_eq!("RN".parse(), Ok(TOTAL_REPEAT_SEQUENCE_COUNTS));
assert_eq!("RUS".parse(), Ok(REPEAT_UNIT_SEQUENCES));
assert_eq!("RUL".parse(), Ok(REPEAT_UNIT_LENGTHS));
assert_eq!("RUC".parse(), Ok(REPEAT_UNIT_COUNTS));
assert_eq!("RB".parse(), Ok(TOTAL_REPEAT_SEQUENCE_BASE_COUNTS));
assert_eq!("CIRUC".parse(), Ok(REPEAT_UNIT_COUNT_CONFIDENCE_INTERVALS));
assert_eq!(
"CIRB".parse(),
Ok(TOTAL_REPEAT_SEQUENCE_BASE_COUNT_CONFIDENCE_INTERVALS)
);
assert_eq!("RUB".parse(), Ok(REPEAT_UNIT_BASE_COUNTS));
assert_eq!("NDLS".parse(), Ok(Key::Other(Other(String::from("NDLS")))));
assert_eq!("".parse::<Key>(), Err(ParseError::Empty));
assert_eq!("8D".parse::<Key>(), Err(ParseError::Invalid));
assert_eq!(".N".parse::<Key>(), Err(ParseError::Invalid));
assert_eq!("A!".parse::<Key>(), Err(ParseError::Invalid));
}
}