use std::io::Write;
use std::path::Path;
use super::canonical::write_canonical_draft;
use super::document_authoring::write_document_draft;
use super::{
RecalculatedWorkbook, RecalculationWriteOptions, WriteReport, XlsxWriteError,
XlsxWriteErrorCode,
};
use crate::{CalculationSnapshot, WorkbookDraft};
pub fn write_xlsx_draft_bytes(
draft: &WorkbookDraft,
calculation: &CalculationSnapshot,
options: RecalculationWriteOptions,
) -> Result<RecalculatedWorkbook, XlsxWriteError> {
if draft.is_document_backed() {
return write_document_draft(draft, calculation, options);
}
write_canonical_draft(draft, calculation, options)
}
pub fn write_xlsx_draft<W: Write>(
draft: &WorkbookDraft,
calculation: &CalculationSnapshot,
writer: &mut W,
options: RecalculationWriteOptions,
) -> Result<WriteReport, XlsxWriteError> {
let output = write_xlsx_draft_bytes(draft, calculation, options)?;
writer.write_all(output.bytes()).map_err(io_error)?;
writer.flush().map_err(io_error)?;
let (_, report) = output.into_parts();
Ok(report)
}
pub fn write_xlsx_draft_path(
draft: &WorkbookDraft,
calculation: &CalculationSnapshot,
path: impl AsRef<Path>,
options: RecalculationWriteOptions,
) -> Result<WriteReport, XlsxWriteError> {
let output = write_xlsx_draft_bytes(draft, calculation, options)?;
output.save_path(path, options.write_options())?;
let (_, report) = output.into_parts();
Ok(report)
}
fn io_error(error: std::io::Error) -> XlsxWriteError {
XlsxWriteError::new(XlsxWriteErrorCode::Io).with_cause(error)
}