///|
pub(all) enum NormalizationOutcome {
Changed(VcfRecord)
Unchanged(VcfRecord)
Invalid(String)
} derive(Debug, Eq)
///|
pub fn normalize_record(record : VcfRecord) -> NormalizationOutcome {
if record.ref_allele == "" || record.alt_alleles.length() != 1 {
NormalizationOutcome::Invalid(
"normalization requires exactly one alternate allele",
)
} else {
let alt = record.alt_alleles[0]
if alt == "" ||
is_symbolic_allele(alt) ||
is_symbolic_allele(record.ref_allele) {
NormalizationOutcome::Unchanged(record)
} else {
let normalized = normalize_basic(record)
if normalized == record {
NormalizationOutcome::Unchanged(normalized)
} else {
NormalizationOutcome::Changed(normalized)
}
}
}
}
///|
fn is_symbolic_allele(allele : String) -> Bool {
allele.length() >= 2 && allele.has_prefix("<") && allele.has_suffix(">")
}