mod collect;
#[cfg(test)]
mod tests;
mod write;
use std::collections::HashMap;
use tokio::task::JoinSet;
use crate::result::GenerateWebfontsResult;
use collect::collect_write_outputs;
use write::{
native_write_task_error, record_written_output, write_output_file,
write_output_file_if_changed, write_output_file_sync,
};
pub(crate) async fn write_generate_webfonts_result(
result: &GenerateWebfontsResult,
) -> std::io::Result<Option<HashMap<String, [u8; 16]>>> {
let mut tasks = JoinSet::new();
let mut written = result.options.incremental.then(HashMap::new);
for output in collect_write_outputs(result)? {
if output.skip_unchanged {
record_written_output(&mut written, &output.path, output.contents.as_bytes());
}
tasks.spawn(async move { write_output_file(output.path, output.contents).await });
}
while let Some(result) = tasks.join_next().await {
result.map_err(native_write_task_error)??;
}
Ok(written)
}
pub(crate) fn write_generate_webfonts_result_sync(
result: &GenerateWebfontsResult,
written: &mut HashMap<String, [u8; 16]>,
) -> std::io::Result<()> {
let outputs = collect_write_outputs(result)?;
for output in outputs {
if output.skip_unchanged {
write_output_file_if_changed(written, output.path, output.contents.as_bytes())?;
} else {
write_output_file_sync(output.path, output.contents.as_bytes())?;
}
}
Ok(())
}