use std::io;
use crate::errors;
use crate::io::fasta;
#[derive(Debug, StructOpt)]
#[structopt(verbatim_doc_comment)]
pub struct Uniq {
#[structopt(short = "s", long = "separator", default_value = "\n")]
pub separator: String,
#[structopt(short = "w", long = "wrap")]
pub wrap: bool,
#[structopt(short = "d", long = "delimiter")]
pub delimiter: Option<String>,
}
pub fn uniq(args: Uniq) -> errors::Result<()> {
let mut last = None::<fasta::Record>;
let mut writer = fasta::Writer::new(io::stdout(), &args.separator, args.wrap);
for record in fasta::Reader::new(io::stdin(), false).records() {
let mut record = record?;
if let Some(ref delimiter) = args.delimiter {
record.header.truncate(
record
.header
.find(delimiter)
.unwrap_or_else(|| record.header.len()),
);
}
if let Some(ref mut rec) = last {
if rec.header == record.header {
rec.sequence.extend(record.sequence);
} else {
writer.write_record_ref(rec)?;
*rec = record;
}
} else {
last = Some(record);
}
}
if let Some(rec) = last {
writer.write_record(rec)?;
}
Ok(())
}