1use std::{
3 io::{Result, Write},
4 path::{Path, PathBuf},
5};
6
7use crate::stats::contigs::ContigSummary;
8
9use super::FileWriter;
10
11const OUTPUT_SUFFIX: &str = "contig-summary";
12const DEFAULT_EXTENSION: &str = "csv";
13
14pub struct ContigSummaryWriter<'a> {
15 summary: &'a [ContigSummary],
16 output: &'a Path,
17 prefix: Option<&'a str>,
18}
19
20impl FileWriter for ContigSummaryWriter<'_> {}
21
22impl<'a> ContigSummaryWriter<'a> {
23 pub fn new(summary: &'a [ContigSummary], output: &'a Path, prefix: Option<&'a str>) -> Self {
24 Self {
25 summary,
26 output,
27 prefix,
28 }
29 }
30
31 pub fn write(&self) -> Result<()> {
32 let output_path = self.create_final_output_path();
33 let mut writer = self
34 .create_output_file(&output_path)
35 .expect("Failed writing to file");
36 self.write_records(&mut writer)?;
37 writer.flush()?;
38 Ok(())
39 }
40
41 fn create_final_output_path(&self) -> PathBuf {
42 match self.prefix {
43 Some(prefix) => {
44 let file_name = format!("{}_{}", prefix, OUTPUT_SUFFIX);
45 self.output
46 .join(file_name)
47 .with_extension(DEFAULT_EXTENSION)
48 }
49 None => self
50 .output
51 .join(OUTPUT_SUFFIX)
52 .with_extension(DEFAULT_EXTENSION),
53 }
54 }
55
56 fn write_records<W: Write>(&self, writer: &mut W) -> Result<()> {
57 writeln!(
58 writer,
59 "file_path,contig_name,\
60 contig_count,base_count,nucleotide,\
61 GC_content,AT_content,\
62 sum,min,max,mean,median,\
63 N50,N75,N90,\
64 contig_750,contig_1000,contig_1500,\
65 G_Count,C_Count,A_Count,T_Count"
66 )?;
67 for summary in self.summary {
68 writeln!(
69 writer,
70 "{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{},{}",
71 summary.file_path,
72 summary.contig_name,
73 summary.contig_count,
74 summary.base_count,
75 summary.nucleotide,
76 summary.gc_content,
77 summary.at_content,
78 summary.stats.sum,
79 summary.stats.min,
80 summary.stats.max,
81 summary.stats.mean,
82 summary.stats.median,
83 summary.nstats.n50,
84 summary.nstats.n75,
85 summary.nstats.n90,
86 summary.contig750,
87 summary.contig1000,
88 summary.contig1500,
89 summary.g_count,
90 summary.c_count,
91 summary.a_count,
92 summary.t_count,
93 )?;
94 }
95
96 Ok(())
97 }
98}