use std::fs::File;
use std::path::PathBuf;
use anyhow::Context;
use noodles::bgzf;
use noodles::bgzf::writer::CompressionLevel;
use noodles::gff;
use noodles::gff::Line::Record;
use crate::utils::args::CompressionStrategy;
use crate::utils::args::NumberOfRecords;
use crate::utils::display::RecordCounter;
use crate::utils::formats;
pub fn to_block_gzipped_gff(
from: PathBuf,
to: PathBuf,
max_records: NumberOfRecords,
compression_strategy: CompressionStrategy,
) -> anyhow::Result<()> {
let mut reader = formats::gff::open(from).with_context(|| "opening input filestream")?;
let compression_level: CompressionLevel = compression_strategy.into();
let mut writer = File::create(to)
.map(|f| {
bgzf::writer::Builder::default()
.set_compression_level(compression_level)
.build_with_writer(f)
})
.map(gff::Writer::new)
.with_context(|| "opening output filestream")?;
let mut counter = RecordCounter::default();
for result in reader.lines() {
let line = result?;
writer.write_line(&line)?;
if let Record(_) = line {
counter.inc();
if counter.time_to_break(&max_records) {
break;
}
}
}
Ok(())
}