use std::path::Path;
use std::sync::Arc;
use henad_core::explore::measure::MeasurePlan;
use henad_core::explore::plan::Plan;
use henad_core::params::ParamDescriptor;
use crate::output::manifest::Manifest;
use crate::output::runs_csv::RunsWriter;
use crate::output::series_csv::SeriesWriter;
use crate::output::summary_csv::{SummaryError, write_summary};
use crate::output::{
MANIFEST_FILE, OutputError, OutputWriter, RUNS_FILE, SERIES_FILE, SUMMARY_FILE, manifest_text, write_error_at,
};
#[derive(Debug, Clone, Default, PartialEq, Eq)]
pub struct SweepFiles {
pub runs: Vec<u8>,
pub series: Vec<u8>,
pub summary: Vec<u8>,
pub manifest: Vec<u8>,
pub search_tables: Vec<(&'static str, Vec<u8>)>,
}
impl SweepFiles {
pub(crate) fn assemble(writer: OutputWriter<Vec<u8>>, manifest: &Manifest) -> Result<Self, OutputError> {
let (runs, series) = writer.finish().map_err(write_error_at(Path::new(RUNS_FILE)))?;
let summary = match write_summary(runs.as_slice(), Vec::new()) {
Ok(summary) => summary,
Err(SummaryError::Read(source)) => {
return Err(OutputError::Read {
path: Path::new(RUNS_FILE).to_owned(),
source,
});
}
Err(SummaryError::Io(source)) => return Err(write_error_at(Path::new(SUMMARY_FILE))(source)),
Err(error) => return Err(OutputError::Summary(error)),
};
Ok(Self {
runs,
series,
summary,
manifest: manifest_text(manifest)?.into_bytes(),
search_tables: Vec::new(),
})
}
pub fn entries(&self) -> Vec<(&'static str, &[u8])> {
let mut entries: Vec<(&'static str, &[u8])> = vec![
(RUNS_FILE, &self.runs),
(SERIES_FILE, &self.series),
(SUMMARY_FILE, &self.summary),
(MANIFEST_FILE, &self.manifest),
];
entries.extend(self.search_tables.iter().map(|(name, bytes)| (*name, bytes.as_slice())));
entries
}
pub fn into_entries(self) -> Vec<(String, Vec<u8>)> {
let mut entries = vec![
(RUNS_FILE.to_owned(), self.runs),
(SERIES_FILE.to_owned(), self.series),
(SUMMARY_FILE.to_owned(), self.summary),
(MANIFEST_FILE.to_owned(), self.manifest),
];
entries.extend(
self.search_tables
.into_iter()
.map(|(name, bytes)| (name.to_owned(), bytes)),
);
entries
}
}
pub(crate) fn memory_writer(
plan: &Arc<Plan>,
params: &[ParamDescriptor],
measure: &MeasurePlan,
) -> Result<OutputWriter<Vec<u8>>, OutputError> {
let runs = RunsWriter::new(Vec::new(), params, plan.actions(), measure.reducers().names())
.map_err(write_error_at(Path::new(RUNS_FILE)))?;
let series = SeriesWriter::new(Vec::new(), measure.columns()).map_err(write_error_at(Path::new(SERIES_FILE)))?;
Ok(OutputWriter::new(Arc::clone(plan), runs, series))
}